导语:背景 通过本地文件包含(Local File Inclusion)攻击,攻击者可以对服务器进行欺骗,使其共享不公开的文件,而不公开的文件中可能会包含网站的配置、日志和源代码文件。甚至有时该漏洞会导致远程代码执行。因此,LFI攻击被认为具有较高的

背景

通过本地文件包含(Local File Inclusion)攻击,攻击者可以对服务器进行欺骗,使其共享不公开的文件,而不公开的文件中可能会包含网站的配置、日志和源代码文件。甚至有时该漏洞会导致远程代码执行。因此,LFI攻击被认为具有较高的威胁性。

大多数LFI攻击都是由动态加载图像(或其他文件)的代码引起的。如果请求的文件名或路径未经正确验证,那么服务器将会向攻击者提供所请求的私有文件。接下来,我们将对IKEA.com上发现的这一漏洞展开深入分析。

IKEA是位于福布斯TOP 50的一个知名品牌,他们不仅拥有优秀的家居产品,同时还运营着设计人性化的网站和应用程序。与此同时,IKEA开展了漏洞赏金活动,允许安全研究者对其网站和应用程序进行测试,并在遵守“负责任的漏洞披露原则”的前提下进行公开。

寻找目标

在针对一个域名进行测试时,我通常都首先遍历目标的所有子域名。为了让这一工作更为简单,我使用Aquatone工具,这一工具会在不同的公共域名数据库中进行搜索,并返回一个质量较高的活动子域名列表,同时还包含这些域名的截图。如果想要了解关于Aquatone的更多信息,建议查看Apple.com报告中的“Unrestricted File Upload”部分。

2.png

锁定目标:浴室规划师

我们找到的一个子域名是Bathroomplanner.IKEA.com,这是一个工具,可以让客户自行查找产品,并将其添加到自己的浴室产品列表中。

客户可以通过电子邮件的方式,将产品列表发到自己的邮箱,或者以PDF格式从本地下载。生成的PDF文件中包含一些文本和产品图片,可能看起来没有什么特别之处。

3.png

4.png

但是,我们有一个疑问,PDF是如何生成的?

拦截网络流量

要拦截网络流量,最好的工具就是Burp Suite了。于是,我们启动Burp Suite,开始拦截浏览器和IKEA网络服务器之间的流量。

我们打开首页,并试图将产品添加到我们的列表之中。

接下来,能够看到一些有趣的字段:

Data:包含产品和图像代码的JSON Blob,没有文件路径;
Shopping:包含产品列表的JSON Blob,没有文件路径;
Pdf:一长串字符,内容不明;
Images:一些Base64编码后的图像。

识别Base64编码字符串

如果我们发现一长串由字母和数字组成的字符,那么首先应该检查它是否为Base64编码的字符串。Base64编码通常用于文件的数据传输。在这里,有一个用于解码Base64字符则在线工具,位于:http://decodebase64.com/

6.png

我们将该字符串粘贴到解码器中,将会报错,原因在于字符串中包含%之类的无效字符。看到%符号,我们应该立刻联想到URL编码,因此我们在进行Base64解码之前,首先尝试进行URL解码。有一个URL解码的工具,位于:https://meyerweb.com/eric/tools/dencoder/

7.png

我们进行URL解码和Base64解码后,得到以下字符串:

8.png

这看上去很有趣。如果我们将产品添加到列表中,还会从IKEA的Web服务器中,提供一些用于生成PDF购物清单的模板。

如果我们能够将本地服务器文件放到PDF中,那么会怎样呢?例如,我们可以使其作为图像中的一部分显示。于是,我们尝试着将<img src=”/etc/passwd”>添加到模板中,再对其进行Base64编码和URL编码,替换掉Burp Suite拦截数据包中的pdf参数,并发送出去。

然而,这样的操作并不起作用,PDF生成器无法将这个文件识别成图像,并且也不会在输出中解析其中的内容。

再次尝试:识别PDF库,查找库中的漏洞

也许我们可以采取另一种方法,使PDF中包含文件。首先,我们需要找到用于生成PDF的工具。借助Google,我们搜索了模板中一些有特点的字符串,得到了如下搜索结果。

9google.png

现在,我们有两个选择:node-html-pdf库或mPDF库。在快速阅读了这两个库的文档后,我们发现它实际上是在这个项目中使用的mPDF库。

定位mPDF中的安全问题

我们立刻制作了一个mPDF的本地副本,以便检查它是否存在安全漏洞。一个比较好的起点是CHANGELOG,开发人员通常都使用该文件来跟踪版本之间的变化。

10.png

我们发现,在2017年10月19日的一次修改中,mPDF改变了他们处理注释标签的方式。因此,我们开始仔细查看文档中的这一标签。

11.png

在这里面,没有提到文件包含。让我们再次Google搜索,看看是否有其他人发现过相关的问题。

12.png

我们阅读了h0ng10提交的漏洞报告, 发现旧版本的mPDF存在严重的安全问题,其中有一个位置,能够以注释标记的方式包含文件。

接着,我们仔细查看了这个项目的Github提交,发现了其中有一段易受攻击的mPDF代码。

因此,我们可以对PDF的模板进行更改,找到上述漏洞详情所提到的标签位置,并尝试对其进行漏洞利用。

攻击过程

我们将以下标记添加到模板中:

<annotation file=\”/etc/passwd\” content=\”/etc/passwd\” icon=\”Graph\” title=\”Attached File: /etc/passwd\” pos-x=\”195\” />

随后,使用Burp Suite Repeater发送新模板并下载PDF文件。完成后,我们再用Foxit Reader打开文件,并开始寻找注释标记(如图中标黄的位置所示)。
13.png

双击这一标记,就能够打开从服务器上获取到的文件,由此证明,我们的攻击获得了成功。

14.png
总结

IKEA.com网站上提供了一个为用户导出PDF版本购物清单的功能,而该功能中所使用的PDF库受漏洞影响,允许攻击者通过在模板中添加特定标记,将文件嵌入到PDF中。这一功能在最新版本的该PDF库中已被禁用,但IKEA未将使用的PDF库更新到最新版本,因此我们成功利用了这一漏洞。在尝试中,我们证明了能够越权获得IKEA Web服务器上的文件,并成功得到了其生产服务器上/etc/passwd文件。

修复方案

不允许用户操纵PDF模板;

在客户端渲染包含购物清单的PDF,可以使用jsPDF;

更新到最新版本的mPDF库,禁用注释代码。

时间节点

2018年6月16日 发现此漏洞,通过Zerecopter提交漏洞详情

2018年6月17日 发现PDF生成功能已经被禁用(推测是IKEA通过IDS发现我们获取到了敏感文件)

2018年6月18日 Zerocopter无法确认漏洞是否存在(因为PDF生成功能已被禁用),但根据报告中的内容,将这一漏洞情况通知IKEA

2018年6月25日 请求Zerocopter向我们同步当前进展

2018年6月27日 Zerocopter反馈:IKEA在6月19日就开始修复这一问题

2018年8月9日 经过多次沟通,确认IKEA已修复这一漏洞

2018年8月13日 Zerocopter建议我在公开漏洞详情时,隐去IKEA的名称

2018年8月20日 经过与IKEA团队的反复沟通,要求按照“负责任的漏洞披露原则”进行漏洞详情公开

2018年9月11日 获得Zerocopter的250欧元漏洞奖励

2018年9月17日 在多次协商沟通后,IKEA终于对“负责任的漏洞披露原则”进行了正确理解,并正式授权我可以披露漏洞详情

2018年9月18日 发布漏洞详情

源链接

Hacking more

...