目录
[1. XML基础](#1. XML基础)
[2. XXE基础知识](#2. XXE基础知识)
[2.1. 结构](#2.1. 结构)
[2.2. 定义与原理](#2.2. 定义与原理)
[2.3. XML实体类型](#2.3. XML实体类型)
[2.4. 攻击类型](#2.4. 攻击类型)
[2.5. 防御措施](#2.5. 防御措施)
[3. pikachu靶场xxe练习](#3. pikachu靶场xxe练习)
学习xxe前提:了解xml格式
1. XML基础
文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。
内部声明DTD
<!DOCTYPE 根元素 [元素声明]>
引用外部DTD文档
<!DOCTYPE 根元素 SYSTEM "文件名">
<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">
内部声明实体
<!ENTITY 实体名称 "实体的值">
引用外部实体
<!ENTITY 实体名称 SYSTEM "URI">
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">
调用方式:&实体名称;
设计它的目的是传输数据。XML语言的出现核心是用来展示及数据的交互

2. XXE基础知识
2.1. 结构

2.2. 定义与原理
XXE(XML External Entity)即XML外部实体注入攻击 ,利用XML解析器的配置缺陷 ,通过构造恶意外部实体,读取文件、发起SSRF攻击或执行远程 代码 。XML允许自定义实体,当解析器处理外部实体(SYSTEM
关键字)时,若未严格限制,攻击者可注入恶意实体访问系统资源。
服务端接收了并解析了来自用户端的xml数据,但是没有做到严格的分析和过滤,导致外部实体注入
2.3. XML实体类型
- 内部实体 :在文档内定义,如
<!ENTITY name "value">
。 - 外部实体 :引用外部资源,如
<!ENTITY ext SYSTEM "file:///etc/passwd">
。 - 参数实体 :用于DTD内部,以
%
声明,如<!ENTITY %n param "content">
。
%n表示=content,也可以理解为调用。
2.4. 攻击类型
- 文件读取 :利用
file://
协议读取服务器文件(如/etc/passwd
)。 - SSRF(服务端请求伪造) :通过
http://
等协议探测内网服务。 - 拒绝服务(DoS) :加载大文件(如
/dev/random
)耗尽资源。 - 远程代码执行(RCE) :需特定环境支持(如PHP的
expect
模块)。 - 综合能力,主要学会融会贯通,洞与洞之间的联通,
2.5. 防御措施
- 禁用外部实体 :配置解析器禁用DTD和外部实体(如Java的
DocumentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
)。 - 使用安全解析器 :如Python的
defusedxml
库。 - 输入过滤 :移除XML中的
DOCTYPE
声明和敏感关键字。 - 数据格式替代:优先使用JSON等非XML格式。

3. pikachu靶场xxe练习
如图所示,图中具有一个接口,可以接受我所打入的xml代码。
现在我使用下面xml码传输数据
<?xml version = "1.0"?>
<!DOCTYPE note [
<!ENTITY hacker "shuaitan">
]>
<name>&hacker;</name>

具有回显
构造payload
接下来利用file协议进行敏感文件查看

查看文件: win.ini 该文件之前在文件包含时也查询过
是系统的默认文件
<?xml version = "1.0"?>
<!DOCTYPE note [
<!ENTITY hacker SYSTEM "file:///C:/windows/win.ini">
]>
<name>&hacker;</name>
敏感文件查看:
