XXE 利用 XML 解析器默认启用外部实体功能,通过构造恶意 XML 读取服务器本地文件、发起 SSRF 请求或触发拒绝服务,曾影响 Facebook、Uber、Apple 等大型平台的漏洞赏金项目。

| OWASP 2017 排名 | A4 XML 外部实体注入 |
| 相关攻击 | Billion Laughs DoS、带外 XXE SSRF |
| PHP 修复版本 | 8.0 起 libxml 默认禁用外部实体 |
XML 规范允许在文档类型定义(DTD)中声明「实体」,类似变量。外部实体可以引用文件系统路径或 URL:
]>
当解析器处理 &xxe; 时,就会把 /etc/passwd 的内容插入文档。如果应用把解析结果返回给调用方(哪怕是错误信息),攻击者就读到了文件内容。这是最直接的「有回显 XXE」。
无回显场景下,攻击者可借助带外通道(DNS 或 HTTP 请求)把文件内容外带出去,与 SSRF 的带外技巧异曲同工。另一个变体是 Billion Laughs(十亿笑声)攻击:声明层层嵌套的实体引用,展开后内容膨胀数十亿倍,用极小的 XML 文件耗尽解析器内存,造成拒绝服务。[1]
根本防御是在 XML 解析器层面禁用外部实体和 DTD 处理。不同语言的做法各异:Java 的 DocumentBuilderFactory 需要设置 setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);Python 的 lxml 在 2.3.x 后默认禁用;PHP 的 libxml 需要调用 libxml_disable_entity_loader(true)(PHP 8.0 后已默认禁用)。
如果业务不需要 XML,考虑换用 JSON。如果必须用 XML,确认使用的库版本及其默认安全策略——许多「安全」的默认值是在多个版本的演进中逐步改变的,老旧依赖是主要风险来源。2017 年 XXE 首次进入 OWASP Top 10(A4 位置),2021 年被合并入 A05 安全配置错误类别。

| OWASP 2017 排名 | A4 XML 外部实体注入 |
| 相关攻击 | Billion Laughs DoS、带外 XXE SSRF |
| PHP 修复版本 | 8.0 起 libxml 默认禁用外部实体 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧