利用动态PDF实现本地文件包含(宜家)
背景
本地文件包含(LFI)可以说是一个相当厉害的漏洞,攻击者可借此获得服务器上的众多隐私文件,例如网站的配置文件,日志文件和源代码文件。有时甚至可以发展为远程执行代码。因此,LFI一般是我漏洞挖掘时的重中之重。
大多数LFI都是由于动态加载图像或其他文件的代码出现缺陷引发的。如果服务器没有验证攻击者请求的文件名或路径是否安全,它就会主动向攻击者提供大量敏感信息。
IKEA.com
宜家是世界范围内的著名的品牌;它在福布斯榜排名前50名。基本上每个人都可以在上面找到自己喜欢的家具,而对于我来说,我最喜欢的家具就是它们的“Bug Bounty”,就让我们开始吧。
寻找目标
测试开始时,我习惯枚举目标的所有(子)域。而我使用的工具是Aquatone。此工具会在不同的公共域数据库中查找子域名,并返回一个看起来很不错的活动子域列表,甚至还有屏幕截图。我以前写过一篇在苹果网站发现文件包含的文章,使用的正是Aquatone。
Bathroom planner
而我最终在这些子域名中盯上Bathroomplanner.IKEA.com,这是一个展示浴室用品的网站,你查找自己所需的产品,并将其添加到自己的浴室产品列表中。
你还可以以PDF格式在往本地下载浴室产品列表,得到一个包含文本和产品图像的PDF文件,乍一看,似乎是个很普通的功能。
但是,这个动态生成的PDF似乎有点意思。
查看流量
接下来,我用了BurpSuite去查看当我把浴室产品添加到我的浴室产品列表时所发出的流量。
我们可以看到在HTTP请求中有很多有意思的字段:
- data; 包含产品和图像代码的JSON blob,没有文件路径
- shopping; 包含我们的产品列表的JSON blob,没有文件路径
- pdf:一长串字符,内容暂不清楚
- images:一些base64编码得图像
识别base64字符串
此时,我的重点自然是pdf
那一长串字符,它们看起来就像被base64编码过,base64编码通常用来处理一些特殊字符,在HTTP请求中很常见,也很容易解码,我使用了http://decodebase64.com/网站对它进行了解码。
但是,由于它包含了%
这类无效字符,导致解码失败。所以我要先用https://meyerweb.com/eric/tools/dencoder/对其进行URL解码,然后再进行base64解码。
很快,我得到了如下字符串。
Ok,这看起来很有趣。貌似这是一个固定格式,我好像可以通过提交HTML代码去生成PDF文件。如果我将本地服务器文件包含到此PDF文件中,会发生什么?于是我将<img src=”/etc/passwd”>
添加到pdf的内容里面,再进行base64和URL编码,最后替换BurpSuite中的pdf参数并按Forward。
好吧,肯定没那么简单。PDF生成器既不会将此文件识别为图像,也不会在输出中解析它...。
Plan B
看样子我们需要更加规范的方式来往PDF中塞入我们的代码。首先,我们需要确定宜家的pdf动态生成机制是用什么技术实现的。我在Google中搜索了几个独特字符串,很快找到了结果。
现在我们有两个选项,node-html-pdf库或mPDF库。在快速阅读了两者的文档之后,我发现宜家使用的是mPDF库。
mPDF
我立刻开始研究mPDF,好挖掘它的安全漏洞。最好的起点就是它的CHANGELOG,这一般是用来跟踪版本之间变化。
很快,我注意到了有关处理注释标签的安全类改进记录。这个记录时间为2017年10月19日。让我们仔细看看说明文档中关于此标签的说明。
嗯..好像没有涉及到本地文件包含。让我们再次谷歌一下吧。
看来,旧版本的mPDF存在严重的安全问题,从h0ng10报告的问题可以看到,该注释标签可以用来包含文件。
如果我们仔细看看这个项目的Github的commit,我们就会发现存在漏洞的mPDF代码。
现在,让我们可以更改一下参数PDF
的内容,使用这个注释标签来包含文件,如果宜家网站的mPDF没有及时更新,攻击应该就会生效。
攻击
我们将以下代码添加到模板中:
<annotation file=\”/etc/passwd\” content=\”/etc/passwd\” icon=\”Graph\” title=\”Attached File: /etc/passwd\” pos-x=\”195\” />
使用BurpSuite的Repeater模块发送请求,接着下载PDF文件。然后我们用Foxit Reader打开文件,并开始寻找黄色注释标记。
Bingo!我们成功看到了/etc/passwd
文件。是时候提交漏洞报告并等待宜家的回复了!
结论
IKEA.com旗下的浴室产品网站能动态生成pdf文件,内容由用户控制。由于未及时进行安全更新,该功能存在严重的安全漏洞,攻击者可以借此读取服务器本地文件,例如我在上面所读取的/etc/passwd
文件。
解决方案
- 禁止用户操作PDF模板
- 使用其他动态生成PDF的模块
- 更新到最新版本的mPDF库,禁用注释标签
奖励
250欧元
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://medium.com/@jonathanbouman/local-file-inclusion-at-ikea-com-e695ed64d82f
最新评论