漏洞原理
当XML文件中出现关键字“SYSTEM”定义的“实体”(DOCTYPE头部标签中会呈现),便可通过XML文件中定义的’实体’ , 访问本地或者远程的内容。这时候,XML解析器在SYSTEM的作用下从URI中读取内容,并允许它在XML文档中被替换,从而造成外部实体攻击。此时,Web应用如果产生数据回显,则会将URL中的数据呈现在应用界面上。
而如果Web端注意到这一点,没有设置回显,那么攻击者可以将数据通过外数据通道发送到攻击者服务器,从而达到攻击效果。
漏洞复现
有回显
用phpstudy搭建:
在网站根目录下新建两个文件:pwd.txt 和 test.php
其中pwd.txt随便填入(我填入了 12345)
test.php:
注意几点:
“
最后的”EOF;”在最左端且右边也没有空格
我们设置这样一个test.php来模拟攻击过程:
直接访问
可以看到回显:
这便得到我们需要读取的pwd.txt数据
没有回显
我们改变一下test.php:
这时候便没有了回显
我们要重新获得pwd.txt
便需要将回显数据通过外数据通道发送到另一个服务器:
首先我们介绍一下参数实体和一般实体的区别:
参数实体必须定义在单独的DTD文档中或XML文档的DTD区(但是引用只能在DTD文档中,即外部子集,而不能在XML文档的DTD区),前者为该XML文档的外部子集,后者为该XML文档的内部子集
参数实体的作用是作为DTD中的元素的条件控制。参数实体定义以%作为开头,引用也以%开头,以;结尾。一般实体的定义无%开头,引用以&开头,以;结尾
在DTD文档中,
这里,我们需要利用外部实体中的URL发出访问
有一种情况
不太明白为什么不可以(但它确实不可以)
而且:内部实体嵌套也不可行:
因为解释器不允许在内层实体中使用外部连接,无论内层是一般实体还是参数实体。
所以我们将嵌套的实体声明放入到一个外部服务器的文件中:
从而我们模拟攻击的test.php为:
注意到我们先进行了引用xml
将放在我服务器上的xml文件引用过来解释到上下文
再利用这个milin.xml得到数据
我们构造milin.xml并保存到云服务器上:
(注意到有时候为防止引用错误,常用% 来代替 %)
我们再构造一个get.php放在服务器来保存收到的数据:
这时候访问URL来模拟攻击:
便可在服务器的key.txt中看到本地的pwd.txt文件内容了:
应用
这里引用Hgame2018中的一道Web题目:
打开题目链接,直接查看网页源码:
估计就是xxe漏洞了:
先乱提交一波
这里有个注意点:
base64解码后存在+会被解码成空格
所以提交payload时先base64再url编码:
回显:
所以我们需要利用blind xxe漏洞:
构造:
打开服务器的key.txt
即得flag:
领取专属 10元无门槛券
私享最新 技术干货