SSTI(服务器端模板注入)漏洞总结 作者: ynnddddd 时间: 2025-03-06 分类: 学业,网络安全,SSTI #### **1. 漏洞概述** - **定义**:SSTI(Server-Side Template Injection)发生在使用模板引擎的Web应用中,当用户输入被**直接拼接**到模板中且未过滤时,攻击者可注入恶意模板代码,导致服务端执行任意命令。 - **核心问题**:用户输入作为模板的一部分被解析,而非普通数据。 #### **2. 常见模板引擎** - **Python**:Jinja2、Mako、Tornado - **Java**:Thymeleaf、FreeMarker - **PHP**:Twig - **JavaScript**:Handlebars、EJS #### **3. 漏洞成因** - **直接拼接用户输入**:如将URL参数、表单数据未经处理嵌入模板。 - **示例**: ```python # Flask漏洞代码示例 @app.route('/greet/') def greet(username): return render_template_string(f'Hello {username}') # 用户输入直接渲染 ``` 若用户输入`{{7*7}}`,页面返回`Hello 49`,则存在SSTI。 #### **4. 攻击方式** - **执行任意代码**:通过注入模板语法访问底层对象或执行命令。 - **Jinja2示例**: ```python {{ ''.__class__.__mro__[1].__subclasses__()[X].__init__.__globals__['os'].popen('id').read() }} ``` 其中`X`为可利用子类的索引(如`os._wrap_close`类)。 - **Twig示例**: ```php {{ _self.env.registerUndefinedFilterCallback("exec") }} {{ _self.env.getFilter("id") }} ``` #### **5. 漏洞危害** - **远程代码执行(RCE)**:控制服务器,执行系统命令。 - **敏感信息泄露**:数据库凭证、环境变量、配置文件等。 - **文件系统操作**:读取/修改服务器文件,如`/etc/passwd`。 #### **6. 防御措施** - **避免拼接用户输入**:确保用户输入仅作为数据,而非模板代码。 - **严格过滤与转义**:对用户输入中的特殊字符(如`{{ }}`、`${}`)进行转义。 - **使用安全配置**: - 启用模板引擎的自动转义(如Jinja2的`autoescape=True`)。 - 限制模板执行环境(沙箱),但需注意沙箱绕过风险。 - **输入验证**:采用白名单机制,仅允许合法字符。 - **更新与维护**:及时修复模板引擎的已知漏洞。 #### **7. 检测方法** - **模糊测试**:输入`{{7*7}}`、`${7*7}`等,观察是否被计算。 - **工具扫描**:使用Burp Suite、tplmap等工具自动化检测。 #### **8. 实例场景** - **漏洞场景**: ```python # 用户注册页面渲染欢迎信息 @app.route('/welcome/') def welcome(name): return render_template_string(f'Welcome, {name}!') ``` 攻击者访问`/welcome/{{config}}`可泄露Flask配置信息。 #### **9. 扩展注意事项** - **引擎语法差异**:不同引擎的注入语法不同(如Jinja2的`{{}}`,Thymeleaf的`${}`)。 - **上下文感知**:部分引擎在不同上下文(HTML/JavaScript)中转义规则不同。 - **沙箱绕过**:某些引擎的沙箱机制存在历史漏洞(如Jinja2沙箱逃逸)。 #### **10. 总结** SSTI是高风险漏洞,防御需结合安全编码、输入过滤、引擎安全配置等多层措施。开发中应避免信任用户输入,并定期进行安全审计。 标签: none