原理
XXE漏洞全称:XML External Entity Injection,即外部实体注入,大多数情况下是针对XML输入类型的攻击,那么首先了解一下XML是什么
XML
XML全称:Extensible Maekup Language,即可扩展标记语言,主要功能是用来传输于储存数据的,一般采用树形结构,具体语法看着很像HTML。
语法
举个例子
1 | <?xml version="1.0" encoding="utf-8"?> |
解释一下,第一行是定义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 | <?xml version="1.0" encoding="utf-8"?> |
其中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 | <?xml version="1.0" encoding="utf-8"?> |

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