服务器端模板注入攻击(SSTI) 是指威胁行为者利用模板的本机语法并将恶意负载注入模板。然后在服务器端执行受损模板。模板引擎通过将固定模板与易变数据相结合来生成网页。
攻击者使用服务器端模板注入技术将用户输入直接插入模板,允许他们引入任意指令来改变模板引擎的行为。它可以让威胁行为者获得对目标服务器的完全控制。
服务器端模板注入有什么影响?
服务器端模板注入漏洞可能会使网站遭受各种攻击,具体取决于模板引擎的类型及其与应用程序的工作方式。在极少数情况下,这些漏洞不会构成真正的安全风险。然而,在大多数情况下,SSTI 攻击的影响是严重的。
在最严重的情况下,攻击者可以远程执行代码并完全接管后端服务器。然后他们可以使用这些服务器对内部基础设施发起额外的攻击。即使攻击者无法远程执行代码,他们也可能能够读取存储在服务器上的敏感数据或文件。具有读取权限的攻击者仍然可以使用 SSTI 作为许多其他攻击的基础。
如何检测 SSTI 漏洞
纯文本与基于代码的 SSTI 检测
SSTI 漏洞可能出现在需要不同检测技术的两种情况下。
纯文本 SSTI 检测
测试人员可以通过使用模板表达式作为不同模板引擎使用的有效载荷来检测纯文本上下文中的 SSTI 漏洞。然后,引擎可以在错误消息中查看服务器的 HTTP 响应。
常见模板表达式的一些示例包括:
基于代码的 SSTI 检测
测试人员可以通过构建有效负载来检索错误或空白服务器响应,从而在代码上下文中测试 SSTI 漏洞。
例如,测试人员可以使用模板语句中的personal_greeting变量在 HTTP 请求中插入 GET 参数。负载服务器将以空白的“Hello”响应:
personal_greeting=用户名 用户 01 您好
接下来,测试人员可以在使用以下有效负载后注入 HTML 标记以中断语句:
personal_greeting=用户名}<tag> 你好 user01 <标签>
当测试人员识别出注入点后,就可以根据相关的模板表达式来识别模板引擎。
输入中使用的恶意或格式错误的有效负载决定了测试人员是否会识别SSTI 。服务器可能会显示错误消息或标记异常。
例如,测试人员可以通过在用户输入参数中注入以下有效负载来检测漏洞:
POST /some-endpoint HTTP/1.1 主机:victim-website.com 参数=${{<%[%'"}}%\.
如果存在漏洞,服务器将响应一个反映模板引擎的错误消息。
识别模板引擎
一旦测试人员检测到模板注入,他们必须确定使用了哪个模板引擎。此步骤可能很简单,测试人员提交无效语法,使模板引擎在生成的错误消息中识别自己。在某些情况下,这种技术是不够的,因为某些东西会抑制错误消息。它也不适合自动化。
或者,测试人员可以使用 Burp Suite 中的决策树自动执行识别步骤。该树可以映射特定于语言的有效载荷,红色和绿色箭头代表失败和成功的响应。有时,单个负载可能有多个成功响应,例如 {{7*'7'}} 探测在 Jinja2 中产生 7777777,在 Twig 中产生 49。
利用漏洞
识别模板注入和底层模板引擎后,测试人员必须尝试阅读文档。此步骤对于识别零日攻击和验证攻击者是否可以利用 SSTI 漏洞 很重要。
主要兴趣点是:
- “对于模板作者”部分——本部分介绍基本语法。
- “安全注意事项”部分——应用程序的开发人员可能跳过了这部分,这可能会提供有用的安全见解。
- 内置功能列表——这应该包括内置函数、方法、变量和过滤器。
- 扩展和插件列表——这可能包括默认启用的外部功能。
如果在这个阶段没有明显的漏洞利用,那么测试人员应该检查环境的可访问性范围。此步骤可能会揭示模板引擎提供的默认对象和开发人员传递给模板的特定于应用程序的对象。一些模板系统可能公开一个名称空间或“自我”对象,允许开发人员列出对象的方法和属性。
开发人员提供的对象更有可能包含敏感数据,并且在应用程序中的多个模板之间可能会有所不同。因此,测试人员应将此过程分别应用于每个模板。
到目前为止,测试人员应该清楚地了解可用的攻击面。最后一步是应用传统的安全审计方法来审查每个功能并识别攻击者可能利用的漏洞。测试人员应将此步骤作为整体应用程序安全的一部分。某些功能可能允许攻击者利用特定于应用程序的功能。
服务器端模板注入攻击防护
从服务器上完全删除模板引擎通常是不可接受的,因为它支持应用程序更改而不会中断正在进行的操作。因此,学习如何在防止 SSTI 的同时安全地使用模板非常重要。
限制“编辑”访问
对所有人开放的模板很容易成为黑客的目标。因此,最好通过对模板文件应用访问规则来限制访问。防止模板被开发人员和管理员以外的任何人修改是至关重要的。此外,生产中使用的模板只能由负责服务器或应用程序的特定管理员访问,而不应由开发人员访问。这可以降低供应链攻击和内部威胁的风险。
清理输入
灭菌可以显着降低 SSTI 攻击的风险。模板应检查所有预期输入是否存在破坏性元素。如果可能,该模板应使用白名单方法来仅允许用户期望的输入,并拒绝其他所有内容。一种常见的方法是使用正则表达式来创建允许的输入模式列表。虽然输入清理很重要,但它是有限的,攻击者有许多创造性的方法来规避它并创建符合允许模式的恶意输入。因此,该解决方案不能保证完全保护。
沙盒
沙盒是一种比清理更安全的方法。这是一种预防措施,可为用户创建安全、隔离的环境。在这个环境中,没有危险的功能或模块,并且对其他数据的访问受到限制。这意味着如果发现漏洞或用户尝试攻击,损害是有限的。对模板进行沙箱处理是一种非常有效的措施,但实施起来却很困难。此外,攻击者可以利用错误配置或尝试提升权限以突破沙盒环境,从而避开沙盒。
无逻辑模板
也许最安全的方法是使用无逻辑模板。这些是将代码解释与视觉表示完全分开的模板。无逻辑模板引擎的一个例子是 Mustache。无逻辑模板使用控制流语句来确保控件在默认情况下是数据驱动的,从而实现与应用程序逻辑的集成。在此设置中,远程代码执行的可能性变得非常小。