声明:本文中所有操作均在合法合规的靶场环境、虚拟环境中进行。
任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动;不得提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安全活动的程序、工具;明知他人从事危害网络安全的活动的,不得为其提供技术支持、广告推广、支付结算等帮助。
一、XXE 基础概念
1. 漏洞全称
XXE:XML External Entity(XML 外部实体注入漏洞)
- 原理:XML 规范支持外部实体引用,若后端 XML 解析器未禁用外部实体解析,攻击者可构造恶意 XML,使服务端读取本地文件、发起内网请求,形成高危注入漏洞。
2.XML 设计初衷
XML 用于传输、存储结构化数据 ,核心聚焦数据内容描述,DTD 实体语法是 XML 扩展功能,本意是复用数据片段,外部实体可引用本地文件 / 远程 URL,漏洞源于未做安全限制。
二、基础 Payload 解析
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php" >
]>
<root>
<name>&file;</name>
<password>123123</password>
</root>
字段拆解
-
<?xml version="1.0" encoding="UTF-8"?>:XML 头部声明,定义版本与字符编码; -
<!DOCTYPE ANY [...]>:DTD 文档类型定义,用于自定义实体; -
<!ENTITY file SYSTEM "协议路径">:自定义外部实体file,SYSTEM关键字代表加载外部资源; -
&file;:实体调用,解析 XML 时会替换为外部资源内容; -
php://filter/read=convert.base64-encode:PHP 专属伪协议,base64 编码回显文件,规避特殊字符乱码,防止读取内容被页面过滤。
三、修改实体路径实现文件读取
1.Linux 系统(读取系统用户文件)
修改 resource 参数:file:///etc/passwd
/etc/passwd:Linux 系统用户清单文件,存放所有本地用户信息,是 XXE 经典读取目标。
2.Windows 系统(读取本地 hosts)
路径:C:/Windows/System32/drivers/etc/hosts
- hosts 文件:本地域名解析配置文件,可查看自定义域名绑定关系。
补充:常用协议
| 协议 | 作用 |
|---|---|
| file:// | 读取服务器本地任意文件(XXE 最常用) |
| http://,https:// | 发起 SSRF 请求,扫描内网 IP、端口 |
| php://filter | PHP 环境下读取源码并 base64 编码 |
四、XXE 漏洞核心利用方式(补充拓展)
-
读取任意文件
利用**file://**协议读取配置文件、网站源码、密钥、数据库账号配置。
-
SSRF 内网探测
将实体路径改为内网地址,例:http://127.0.0.1:6379,探测内网存活主机与开放端口,攻击内网未授权服务(Redis、Elasticsearch)。
-
DOS 拒绝服务
构造递归实体炸弹,无限嵌套实体,耗尽服务器 CPU / 内存资源,使服务宕机。
<!DOCTYPE x [<!ENTITY a "&a;&a;&a;">]>
<x>&a;</x>
五、XXE 漏洞防御方案
-
禁用 DTD 文档定义(最优方案)
Java/PHP/Python 等解析 XML 时,关闭 DOCTYPE、外部实体解析功能;
-
PHP:
libxml_disable_entity_loader(true); -
Java:
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
-
-
白名单校验 XML 数据,过滤用户可控的 DOCTYPE、ENTITY 关键字;
-
升级 XML 解析组件,使用安全版本解析库。
关键补充知识点
-
有回显 XXE:payload 读取内容直接在页面返回(笔记示例就是有回显场景);
-
无回显 XXE(盲 XXE):页面不返回数据,通过 DNS/HTTP 外带数据,把文件内容带出到攻击者服务器。