三十五、Java中常见解析Excel引入的XXE组件复现与分析

2020/03/03 09:54
阅读数 2.3K
通过该实验的复现和分析Java中常见解析Excel组件引入的XXE漏洞产生原因,并能够根据实验指导书完成实验。
预备知识

 

      在Java中,处理Excel常会用到 Apache POI、Excel-Streaming-Reader、Tika三种组件,由于Excel文件实际上是一个压缩包格式文件,其中的xml文档如果被恶意构造加载外部实体参数,就会导致XXE漏洞。

      在学习本实验之前,建议先学习XXE漏洞基础知识实验和JavaMelody组件XXE漏洞(CVE-2018-15531)原理分析实验待你们分配,一系列XXE漏洞学习)

实验目的

 

通过该实验的复现和分析了解Java中常见解析Excel组件引入的XXE漏洞产生原因,并能够根据实验指导书完成实验。

实验环境

 

服务器:Windows  IP地址:随机分配

Java环境:jdk1.8.0

实验步骤一

 

实验准备

1)在实验开始之前,我们已经在C盘根目录准备好了实验需要用到的POC验证excel文件,如下:

注:实验环境中没有安装Excel不能直接创建,方法供参考。

      新建excel文件 test1.xlsx -> 修改后缀为.zip -> 在zip文件中,修改[Content_Types].xml,在其中加入XXE验证POC -> 重新修改后缀为 .xlsx 

      

 

      同样新建excel文件 test2.xlsx -> 修改后缀为.zip -> 在zip文件中,修改 /xl/workbook.xml,在其中加入XXE验证POC -> 重新修改后缀为 .xlsx

      

 

      同样新建excel文件 test3.xlsx -> 修改后缀为.zip -> 在zip文件中,修改 /xl/worksheets/shee1.xml,在其中加入XXE验证POC -> 重新修改后缀为 .xlsx

      

 

2)在实验开始之前,我们已经安装好了存在漏洞的组件,版本信息分别为:

      Apache POI:poi-ooxml-3.10-FINAL

      Excel-Streaming-Reader:2.0.0

      Tika:tika-app-1.12

      下面实验分别对以上三种组件解析Excel引入XXE漏洞进行复现并分析漏洞产生原因。

 

实验任务一:Apache POI,受影响版本:poi-ooxml-3.10-FINAL 及其以下版本

      示例代码如下:

      

      运行代码,触发漏洞如下:

      

 

      我们在 WorkbookFactory.create() 下断点调试,当进入执行 init 初始化方法时,以zip方式将文件信息传入 OPCPackage.open() 方法,

      然后跟进调用链,如下:

      pack.getParts() -> this.getPartsImpl() -> new ZipContentTypeManager(getZipArchive().getInputStream(entry),this) -> parseContentTypesFile(in)

      发现是直接通过 SAXReader 来解析xml文档,导致xxe漏洞的产生

      

 

      而修复方案,则是在此处增加了一个SAXHelper类来进行防御处理(位置在poi-ooxml-3.10.1.jar!/org/apache/poi/util/SAXHelper.class)

      

实验步骤二

 

实验任务二:Excel-Streaming-Reader,受影响版本:2.0.0及其以下版本

      示例代码如下:

      

      运行代码,触发漏洞如下:

      

      设置断点调试,发现在执行 com.monitorjbl.xlsx.StreamingReader.Builder.open(InputStream) 方法时会对 workbook 进行初始化,跟进

      

      同样通过 OPCPackage.open() 函数来处理zip文档内容,

      

      接下来将我们从excel文件中读取到的 xml 文件传入 document() 方法,导致触发漏洞

      

      跟进 document() 方法,发现是直接通过 dom 方式解析 xml 文件导致了xxe漏洞(位置在 xlsx-streamer-2.0.0.jar!/com.monitorjbl.xlsx.XmlUtils.class)

      

      而修复方式采用的直接禁用外部实体引用,如下:

      

实验步骤三

 

实验任务三:Tika,受影响版本:tika-app-1.12 及其以下版本

      示例代码如下:

      

      同样运行代码即可触发漏洞

      

      首先跟进org.apache.tika.parser.AutoDetectParser.parse() 方法

      

      跟进发现实际被继承的是 org.apache.tika.parser.microsoft.ooxml.OOXMLExtractorFactory.parse()方法,跟进extractor.getXHTML(baseHandler, metadata, context) , 最后定位到执行的在org.apache.tika.parser.microsoft.ooxml.AbstractOOXMLExtractor.getXHTML()

      

      跟进 buildXHTML(xhtml) -> processSheet(sheetExtractor, comments, styles, strings, stream),发现直接通过 SAXParser 解析xml,触发XXE漏洞

      

 

      而修复防范类似poi,采用了 ParseContext 这个类来进行防御处理(位置在 tika-app-1.13.jar!/org/apache/tika/parser/ParseContext.class) 

 

         转载:http://www.hetianlab.com/expc.do?ce=714afce1-dbf9-439b-85ad-fb0ad4e4f093

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部