SSTI服务端&模版注入&利用分类&语言引擎&数据渲染&项目工具&挖掘思路
SSTI(Server-Side Template Injection,服务器端模板注入)是一种安全漏洞,攻击者通过向模板引擎注入恶意代码,在服务器端执行任意指令。以下是 SSTI 的主要使用场景和常见攻击目标:
Web 应用程序(最常见场景)
模板引擎的渲染:许多 Web 框架(如 Flask、Django、Spring、Express 等)使用模板引擎(如 Jinja2、Thymeleaf、Freemarker、Twig 等)动态生成 HTML。如果用户输入直接拼接到模板中,可能触发 SSTI。
示例:
# Flask (Jinja2) 漏洞示例@app.route('/greet/<name>')def greet(name): return render_template_string(f"Hello {name}!") # 用户可控的 name 参数可能触发 SSTI
CMS 和博客系统:如 WordPress 插件、Drupal 模块等,如果使用模板引擎处理用户输入,可能存在风险。
2. 邮件模板系统
某些系统会通过模板生成动态邮件内容(如用户注册确认、密码重置邮件)。如果攻击者能控制模板变量,可能注入恶意代码。
示例:
// Thymeleaf 漏洞示例(Spring Boot)@GetMapping("/send-email")public String sendEmail(@RequestParam String username) { return "Email template: " + username; // 用户输入直接拼接到模板}
3. 报告生成工具
企业应用中,动态生成 PDF/Excel 报告的工具(如 Apache Velocity、Freemarker)可能因拼接用户输入导致 SSTI。
4. 低代码/无代码平台
允许用户自定义模板的平台(如企业内部工作流系统),如果未严格过滤用户输入,可能成为攻击入口。
5. CI/CD 流水线
某些 CI/CD 工具(如 Jenkins、GitLab CI)允许使用模板化配置,攻击者可能通过修改参数注入恶意代码。
易受攻击的模板引擎(按语言分类)
语言/框架 | 模板引擎 | 危险表达式示例 |
---|---|---|
Python (Flask) | Jinja2 | {{ 7*7 }} → 输出 49 |
Java (Spring) | Thymeleaf | ${T(java.lang.Runtime).getRuntime().exec('calc')} |
PHP | Twig | {{ _self.env.set("FOO","BAR") }} |
JavaScript | EJS / Pug (Jade) | <%= 7*7 %> |
Ruby | ERB | <%= 7*7 %> |
如何防御 SSTI?
避免直接拼接用户输入:使用安全的模板变量转义机制(如 Jinja2 的
| safe
过滤器)。沙箱环境:限制模板引擎的访问权限(如禁用敏感函数)。
输入验证:严格过滤用户输入的模板语法符号(如
{{ }}
、<% %>
)。最小化模板引擎功能:禁用不必要的特性(如 Java 的
Class.forName
)。
#SSTI测试:
ERB:
<%= exec 'ls -al' %>
Tornado:
blog-post-author-display=user.name}}{{7*7}}
blog-post-author-display=user.name}}{%25+import+os+%25}{{os.system('ls%20-al')
Freemarker:
<#assign test="freemarker.template.utility.Execute"?new()> ${test("ls")}
报错提示:
Django:
{{settings.SECRET_KEY}}
#SSTI利用思路:
1、确定模板引擎
改参数看报错
看模板语法
引擎寻找构造
2、构造payload的思路
寻找可用对象(比如字符串、字典,或者已给出的对象)
通过可用对象寻找原生对象(object)
利用原生对象实例化目标对象(比如os)
执行代码
3、如果手工有困难,可用使用Tqlmap或SSTImap代替
#项目:
https://github.com/epinna/tplmap
https://github.com/vladko312/SSTImap
#挖掘:
https://forum.butian.net/share/1229