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

栏目: 编程工具 · 发布时间: 5年前

内容简介:最近在阅读安全类文章时看到有同学分享如何利用excel进行XXE攻击,阅读后发现一些模糊的利用方式。由于漏洞场景非常常见,让我十分感兴趣,并决定一探究竟。注意本文验证仅用于学习与研究,请勿非法利用。背景知识Microsoft Office从2007版本引入了新的开放的XML文件格式,新的XML文件格式基于压缩的ZIP文件格式规范,由许多部分组成。我们可以将其解压缩到特定的文件夹中来查看其包含的文件夹和文件,可以发现其中多数是描述工作簿数据、元数据、文档信息的XML文件。

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

背景知识

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

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

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进行解压缩,得到以下文件:

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

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

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

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

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

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

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

此时ceye上已产生记录: 

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

漏洞分析

调用链

所列函数的调用顺序从上到下: 

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

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

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

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

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

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

至此,漏洞触发。

修复方案

升级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进行解压缩,得到以下文件: 

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

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

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

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

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

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

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

此时ceye上已产生记录:

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

漏洞分析

调用链

所列函数的调用顺序从上到下: 

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解析文件: 

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

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

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

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

至此,漏洞触发。

修复方案

升级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/


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JSP网站开发典型模块与实例精讲

JSP网站开发典型模块与实例精讲

李振捷 / 电子工业出版社 / 2006-8 / 50.0

本书是典型模块与实例精讲丛书中的一本。 本书讲解了使用JSP开发网站系统的经典模块和工程实例,基本囊括了JSP的重点技术,对这些模块稍加修改就可以直接使用到实际项目中。为了方便本书的读者交流在学习中遇到的问题,特地在本书的服务网站上公布了很多QQ群组,读者只要拥有QQ号码,就可以参与到本书的QQ学习群组中一起讨论学习心得。本书的作者还在一定的时间给读者提供在线答疑服务。一起来看看 《JSP网站开发典型模块与实例精讲》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具