首页/安全/漏洞与攻击面速查/XXE XML 外部实体注入原理
Web 漏洞原理与防护55 条

XXE XML 外部实体注入原理

XXE 出现在解析不可信 XML 时:解析器允许外部实体(DTD)引用,会导致读取本地文件、发起内网请求或拒绝服务;防护是在解析器层面禁用 DTD 与外部实体。

漏洞与攻击面速查安全更新于 2026-10-13

XXE 是什么

XXE(XML 外部实体注入)出现在解析不可信 XML 的场景:多数 XML 解析器默认允许在文档类型定义中声明外部实体,如果解析配置未做限制,构造的文档就能让解析器去读取本地文件、发起内网请求,甚至通过实体嵌套造成拒绝服务。危险点在于「解析不可信输入」这个动作本身,所以防护的方向有两层——能改用 JSON 等纯数据格式就不用 XML,必须解析 XML 时显式关闭外部实体与 DTD 处理。

基本信息

风险类别OWASP Top 10 2021 A05 安全配置错误;CWE-611
触发点解析用户 XML 的入口:SOAP、SVG 上传、Office 文档解析、RSS 处理
危害文件读取、SSRF、拒绝服务
防护禁用 DTD 与外部实体(解析器配置);能用 JSON 就不用 XML
范围要求覆盖所有解析入口,包括旁路与预览功能
验证方式构造无害测试文档确认外部实体不被解析

典型场景

  • SOAP 与 XML-RPC 接口接收外部请求体
  • 图片与矢量图上传:SVG 本质是 XML 文档
  • 文档处理:Office 与 PDF 的元数据解析
  • 订阅与集成:RSS、Atom 与第三方 XML 数据源
  • 配置导入导出:以 XML 作为配置文件格式
  • 报表与模板引擎:以 XML 作为模板语言

排查面

排查面
检索代码中的 XML 解析器初始化点
确认是否设置 disallow-doctype-decl 等安全属性
SVG 与 Office 文档解析库同样需要安全模式
# 常见语言的安全开关:
# Java:工厂类关闭外部实体与 DTD 处理
# Python:lxml 禁用实体解析;defusedxml 提供安全封装
# PHP:libxml_disable_entity_loader 在旧版本中需要显式设置

风险形态与影响

形态说明影响
本地文件读取实体指向本机文件路径配置文件与凭据泄露
内网请求实体指向内网地址内网探测与服务调用
拒绝服务实体嵌套与膨胀解析耗尽内存与 CPU
盲注利用响应不回显内容通过错误与外带通道判断结果
部分语言的默认解析配置本身不安全;升级依赖不会自动修复配置问题,需要显式设置。
把安全解析封装成统一入口是长期方案:所有业务都调用同一个封装函数,避免每处解析各自配置、逐步腐化。

易错点

  • 只对主接口做了配置:文件导入、预览等旁路解析同样可被利用,所有解析入口要统一封装
  • 认为升级依赖就安全:默认配置未变,解析行为也不会变,需显式关闭特性
  • 忽略 SVG 与文档解析:这些格式常被当作图片处理,实际走 XML 解析链路
  • 只做黑名单过滤关键字:实体声明形式多样,绕过成本低,应从解析器配置入手
  • 测试只用正常文档:应构造无害测试用例确认外部实体确实不被解析
  • 新增解析入口不再复核:新业务上线后可能引入新的解析点,需纳入检查项

数据来源与参考

  • OWASP XXE Prevention Cheat Sheet
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌