Blind XXE漏洞简析

漏洞原理

当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:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180308G1PUAF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券