通过该实验的复现和分析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