什么是服务器端模板注入?
SST(服务器端模板)提供了一种处理 HTML 代码动态生成的简单技术。尽管它们也可以成为 SSTI(服务器端模板注入)的目标。
SST 让开发人员可以直接在服务器上使用自定义用户信息预先填充网页。因此,在服务器内部发出所有请求通常比从浏览器到服务器进行额外的往返更快。它与客户端模板不同,在客户端模板中,浏览器通常会加载影响最终用户总体体验的模板。
功能丰富的 Web 应用程序通常将用户的输入嵌入到 Web 模板中,以提供灵活的快捷方式和功能。这使得漏洞很容易被误认为是跨站点脚本。
SST的工作:
Web 框架最常用的动态创建 HTML 的方法是使用模板。它包括 HTML 输出的静态部分,以及描述如何放置动态内容的语法。
这些模板系统对可疑的模板作者并不安全。例如,网站不应允许其用户提供自己的模板,因为模板作者可以执行跨站点脚本攻击,并且他们还可以获得这些模板变量的属性,这些属性可能包含敏感数据。
然后这些模板引擎处理模板文件,它支持将动态信息填充到网页中。当 HTTP 请求进入时,模板引擎会生成 HTML 输出回复。
一些最常用的服务器端模板引擎是 Jinja2 或 Jinja、Freemaker、Mako、Velocity、Smarty、Tornado、Genshi、Twig、Mustache 等。
SSTI的工作:
当允许恶意用户使用本机模板语法将恶意负载注入模板时,就会发生 SSTI,然后在服务器端执行该模板。
模板引擎旨在通过将固定模板与动态数据合并来创建网页。 SSTI 攻击可能发生在用户输入信息并将其直接连接到模板中,而不是在表单数据中传递信息时。它允许恶意用户注入可以扭曲模板引擎的随机模板命令,通常,它允许他们完全控制服务器。
例如,
Template = “UserName:” + Input
render(template)
- 在上面的示例中,“输入”是模板的一部分。因此,用户可以输入用户名或 Web 应用程序的其他一些参数,例如一些任意代码。因此用户可以输入类似的东西。
Username: {{9*9}}
Username 81
- 如上所示,SST 引擎处理输入 {{9*9}} 并给出 81 作为输出。这表明 Web 应用程序很容易受到攻击。
- 如果发现 Web 应用程序存在漏洞,攻击者甚至可以输入一些恶意代码来获得完全的远程访问权限。例如,
About:{{Malicious Code()}}
SSTI 检测:
SSTI 可以通过纯文本检测方法或代码上下文检测方法检测。
- 纯文本检测方法——
可以使用纯文本检测来检测SSTI,在此可以使用一些常用的模板表达式供测试人员使用。
For example: {{8*5}}, ${2*7}, {{8/0}}, <%= 5/0 %>, ${foobar}, {{9*9}}, etc.
- 代码上下文检测 –
在这种情况下,有效负载可用于获取错误响应。例如,HTTP GET 参数可用于在模板语句中插入变量。
For example: Greet_user = username
Hello user_x
- 如果有效负载服务器只用空白的“Hello”响应。然后测试人员可以跳出模板语句并注入 HTML 标记。例如,
Greet_user = username
Hello
- 现在,注入 HTML 标签。
Greet_user = username}}
Hello user_x
预防措施:
服务器端模板注入的预防措施可能因使用的模板引擎而异。尽管可以使用沙盒和清理来防止此漏洞。
- 沙盒 –
它用于在模拟最终用户操作环境的网络上创建一个隔离的测试环境,用户可以在其中运行、分析或观察代码。它可以避免威胁进入网络,还有助于检查不受信任或未经测试的代码。 - 消毒——
不应从用户控制的输入生成模板。用户只能使用模板参数将输入传递给模板。通过在解析信息之前消除不需要和不安全的字符,在将输入传递给模板之前对其进行清理。这减少了对模板进行任何恶作剧调查的漏洞。