SSTI
https://portswigger.net/web-security/server-side-template-injection
简介
SSTI 全称 Server-side template injection ,服务端模板注入
什么是模板、SSTI
模板引擎被设计用来将可变的数据插入到固定的页面模板中以生成 web 页面。此处的模板指的是 JavaScript template 。其是用来减少工作量、简化开发,用来生成 除数据外页面结构相同的 web 页面。
当用户输入直接被插入到模板中,而不是以值的形式传进去,则会导致攻击者可以注入任意的模板指令。
例如有如下的 PHP 代码,其中 twig 为php 的模板引擎。
# 参数以值的形式传递,不存在该漏洞
$output = $twig->render("Dear {first_name},", array("first_name" => $user.first_name) );
# 参数直接插入到模板中,存在 SSTI
$output = $twig->render("Dear ".$_GET['name']);
# 利用方式
http://vulnerable-website.com/?name={{bad-stuff-here}}
可以看到,该漏洞产生原理和 SQL 注入 相像,都是用户输入参数未作处理,直接当作指令的一部分执行。
是否使用预编译
CSTI & SSTI
根据最终模板代码执行位置的不同,模板注入分为服务端模板注入和客户端模板注入。
漏洞危害
该漏洞最终危害就是执行任意的模板代码。
同样是执行 js 代码,服务端的 js 危害更大。
但通常受限于不同模板引擎的规则,造成的影响也不同,例如绝大多数模板引擎都默认存在沙箱安全机制。
如何攻击
- 检测是否存在模板注入的漏洞
- 识别服务端使用何种模板引擎,因为不同的模板引擎语法不同。
- 进行利用
自动化工具 tplmap https://github.com/epinna/tplmap
效果一般,识别能力不太行,用来利用还不错。
如何防御
攻击
payload 参考:https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection
检测是否存在模板引擎
对参数进行fuzz ${{<%[%'"}}%\
对可疑的输入参数进行审计。
检测
在管理界面有修改显示名的功能,而实际展现修改后的效果,是在另一个页面触发。
利用
查询官方文档,寻找敏感功能,进行利用。