结论:XXE 利用 XML 解析器处理外部实体(<!ENTITY xxe SYSTEM "file:///etc/passwd">)的能力:攻击者提交含恶意 DTD 的 XML,解析器读取本地文件、发起内网请求(SSRF)或发起 billion laughs 实体爆炸拒绝服务。防御的最优解是从解析器配置层面禁用 DTD 和外部实体,而不是过滤输入。
展开:攻击面三种载荷:1)文件读取——实体引用 file:// 协议,结果回显在响应或错误信息里(无回显时用带外 OOB:实体指向攻击者服务器 URL,把文件内容编码进请求带出来);2)SSRF——实体指向内网地址探测端口;3)DoS——嵌套实体指数展开(billion laughs)。防御配置因库而异但目标一致:Java 的 DocumentBuilderFactory/SAXParser 设 FEATURE_SECURE_PROCESSING=true 并 disallow-doctype-decl;.NET 的 XmlReader 默认安全(DtdProcessing.Prohibit)但 XmlDocument 老代码危险;Python 的 defusedxml 替代标准库;PHP 的 libxml_disable_entity_loader。根治思路:能不用 XML 就不用——JSON 无实体机制,SOAP/SAML/Office 文档(docx 是 zip+XML)是遗留重灾区。易错点:升级库版本可能改变默认值(老 JDK 默认不禁),安全配置要显式写出并加单测(提交恶意 XML 验证被拒绝)防回归。
<?xml version="1.0"?>
<!DOCTYPE r [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<r>&xxe;</r>
追问方向:SAML 断言的 XML 签名包装攻击(XSW)与 XXE 的差异、XInclude 在禁 DTD 后的替代注入面。