后端 利用EXCEL文件进行XXE攻击的漏洞分析

chon219 · February 02, 2020 · 122 hits

最近在阅读安全类文章时看到有同学分享如何利用 excel 进行 XXE 攻击,阅读后发现一些模糊的利用方式。由于漏洞场景非常常见,让我十分感兴趣,并决定一探究竟。注意本文验证仅用于学习与研究,请勿非法利用。

背景知识

Microsoft Office 从 2007 版本引入了新的开放的 XML 文件格式,新的 XML 文件格式基于压缩的 ZIP 文件格式规范,由许多部分组成。我们可以将其解压缩到特定的文件夹中来查看其包含的文件夹和文件,可以发现其中多数是描述工作簿数据、元数据、文档信息的 XML 文件。

Poi-ooxml.jar 的 XXE 漏洞

Apache POI 是提供 Microsoft Office 系列文档读、写功能的 JAVA 类库,Apache POI 3.10-FINAL 及以前版本被发现允许远程攻击者通过注入 XML 外部实体读取任意文件。

漏洞编号

CVE-2014-3529

影响范围

poi-ooxml-3.10-FINAL.jar 及以下版本

利用文件

[Content-Types].xml

漏洞利用

新建 test.xlsx 进行解压缩,得到以下文件:

打开 [Content-Types].xml 注入外部实体:

保存后压缩回 test.xlsx 文件:

编写解析程序执行,发现报错:

此时 ceye 上已产生记录:

漏洞分析

调用链

所列函数的调用顺序从上到下:
class=” org.apache.poi.xssf.usermodel.XSSFWorkbook” method=” XSSFWorkbook()”
class=” org.apache.poi.util.PackageHelper” method=” open()”
class=” org.apache.poi.openxml4j.opc.OPCPackage” method=” open()”
class=” org.apache.poi.openxml4j.opc.OPCPackage” method=” getParts()”
class=” org.apache.poi.openxml4j.opc.ZipPackage” method=” getPartsImpl()”
class=” org.apache.poi.openxml4j.opc.internal.ZipContentTypeManager” method=” ZipContentTypeManager()”
class=” org.apache.poi.openxml4j.opc.internal.ContentTypeManager” method=” ContentTypeManager()”
class=” org.apache.poi.openxml4j.opc.internal.ContentTypeManager” method=” parseContentTypesFile()”

关键函数

程序执行至 getPartsImpl() 函数中匹配出了 [Content-Types].xml 文件,并文件数据流传入至 ZipContentTypeManager 中:

ZipContentTypeManager 调用 ContentTypeManager() 函数,ContentTypeManager() 函数中把数据传入了 parseContentTypesFile() 函数进行处理:

parseContentTypesFile() 函数未进行 XXE 漏洞防护,直接对 XML 数据进行解析:

至此,漏洞触发。

修复方案

升级 poi-ooxml.jar 到 3.16 或以上版本。

看到这里,有同学会问,为什么我在阅读其他文章时发现,文章描述的利用方式不是 [Content-Types].xml 文件,而是另外的 xml 文件呢?别着急,下面我们继续另一个漏洞分析。

xlsx-streamer.jar 的 XXE 漏洞

当 Excel 中的数据量较大时,在用 Apache POI 读取文件流时很容易引起失败,需要引入 xlsx-streamer 来进行资源的解析。而 xlsx-streamer 的 2.0.0 及以下版本被发现允许远程攻击者通过注入 XML 外部实体读取任意文件。

影响范围

xlsx-streamer.jar-2.0.0 及以下版本

利用文件

xl/workbook.xml

漏洞利用

新建 1.xlsx 进行解压缩,得到以下文件:

打开 xl/workbook.xml 注入外部实体:

保存后压缩为 2.xlsx 文件:

编写解析程序执行,发现报错:

此时 ceye 上已产生记录:

漏洞分析

调用链

所列函数的调用顺序从上到下:
class=” com.monitorjbl.xlsx.StreamingReader” method=” open()”
class=” com.monitorjbl.xlsx.impl.StreamingWorkbookReader” method=” init(InputStream is)”
class=” com.monitorjbl.xlsx.impl.StreamingWorkbookReader” method=” init(file f)”
class=” org.apache.poi.xssf.eventusermodel.XSSFReader” method=” getWorkbookData()”
class=” com.monitorjbl.xlsx.XmlUtils” method=” document()”

关键函数

程序使用用户传入的 xlsx 文件内容重新生成一个临时文件,并使用 XSSFReader 解析文件:

然后在 getWorkbookData() 函数中会取到 xl/workbook.xml 文件流传入 document() 函数:

document() 函数未对 XXE 攻击进行防御,直接解析 XML 文件:

至此,漏洞触发。

修复方案

升级 xlsx-streamer.jar 到 2.1.0 版本

总结

除上述两个第三方库本身的漏洞外,系统开发人员在编写代码解析 xlsx 文件时,也有可能导致 XXE 漏洞。如 CVE-2016-5000 是在 Poi-examples.jar 的某个示例中被发现的 XXE 漏洞。感兴趣的同学可再进行进一步的研究。

参考文章

https://www.cnblogs.com/zlcom/archive/2013/09/21/3332060.html
http://www.zhutougg.com/2018/11/13/excel-streaming-reader-xxelou-dong/

No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.