背景:
通过本地文件包含攻击,可以获得服务器上禁止访问的例如配置、日志和源代码等私密文件。有时候它还可以导致远程代码执行漏洞,所以说本地文件包含攻击的危害是比较大的。
大多数的本地文件攻击都是由动态加载图片或其他文件的代码造成的。如果没有对请求的文件名或路径做校验,那么服务器就会返回所请求的私密文件。
复现动画
寻找目标
大多数时候我都是扫描所有目标网站下的子域名,Aquatone是个挺好用的工具,它可以在不同的公共域名数据库中查找相关域名并返回可用的子域名。工具效果如图所示:
Aquatone发现了418个可用的子域名。
测试目标
找到的一个攻击目标是Bathroomplanner.IKEA.com,其中有一个工具可以帮助查找产品并将产品添加到自己的浴室购物车中。你可以将购物车用邮件或者直接PDF文件下载的方式保存到本地,这里生成的PDF文件包含了一些文本信息和产品图片,没多少值得看的了。
购物车列表图
但PDF文件是如何生成的呢?
对流量进行抓包分析
一提到抓包,你就会想到……Burp Suite!我们先使用Burp Suite的流量抓取功能试试看。
打开首页后尝试添加一个产品到购物车中。
在添加购物车时抓到的流量包。
可以看到其中几个有趣的数值:
1) data: 一个blob类型的JSON数据,包含了产品和图片编码,没有文件路径。
2) shopping: 一个blob类型的JSON数据,包含了购物车的商品,没有文件路径。
3) pdf: 一个内容不明的超长字符串。
4) images: 一些经过BASE64编码的图片。
了解编码字符串
如果你之前看到一大串字母数字组成的超长字符串,那么就考虑看看它是不是一个BASE64编码后的字符串。BASE64编码常用于文件的数据传输,常用的解码工具是http://decodebase64.com/
解码BASE64
如果我们尝试直接把字符串黏贴到解码网站里会发现报错,这是因为它包含了像%之类的非法字符。不过这也说明它可能还经过URL编码,所以先进行URL解码试试看。这里我用了
https://meyerweb.com/eric/tools/dencoder/来进行URL编码和解码。
URL解码和编码工具
如果我们先进行URL解码,再进行BASE64解码,就会获得下面的字符串:
这里发现个有趣的地方,如果我们将商品添加到购物车中,那么它也会向服务器发送一个用于生成购物车PDF文件的模板数据。
那么如果我们尝试在PDF中进行本地文件包含呢?比如说尝试一个图片?先尝试在模板数据里添加一个<img src=”/etc/passwd”>,通过BASE64和URL编码后,再Burp Suite中替换PDF参数然后前进。
Emmm没有什么效果,PDF无法将文件识别为图片也没有返回任何输出。
第二次尝试:找到PDF库,查找库的漏洞
那么试试看其他办法在PDF中包含文件呢?先在谷歌中查找一些模板中的字符串,就能找到用于生成PDF文件的工具。
Node-html-pdf 和mPDF
所以我们有了两个思路:node-html-pdf库或者是mPDF库,在阅读了两个工具的文档以后我们发现宜家用的是mPDF库。
找到mPDF的安全漏洞
先下载一个mPDF到本地进行审计,从更新日志中可以看到不同版本的更新变化。
查找更新日志中的安全更新,可以节约很多时间。
就像我们在图里看到的一样,mPDF在2017年10月19日更改了注释标签的处理方式,然后我们来看看文档中对注释标签的说明。
文档中没有提到涉及文件包含的问题。
没有找到和文件包含有关的信息,那么谷歌看看其他人有没有写过相关问题。
看这里被提交的一个issue。
h0ng10在旧版本的mPDF中找到了一个严重的安全漏洞,这个漏洞可以通过注释标签来实现文件包含。
如果我们仔细翻阅Github上这个项目的提交记录,就能找到这里危险的mPDF代码位置。
所以我们可以尝试更改PDF的模板数据,利用注释标签来尝试文件包含攻击。那么来看看宜家是否用了新版本的mPDF库。
攻击
将下列标签添加到模板数据中:
<annotation file=”/etc/passwd” content=”/etc/passwd” icon=”Graph” title=”Attached File: /etc/passwd” pos-x=”195” />
用Burp Suite的Repeater功能发送新的模板数据,然后下载PDF文件。用Foxit Reader打开文件查看黄色的注释信息。
双击这里的标注就能看到读取的服务器文件了。也就是说——攻击成功!
读取到的/etc/password文件内容
修复方案
禁止用户修改生成PDF用的模板数据
用jsPDF之类的工具在客户端生成包含购物车信息的PDF文件
更新最新版本的mPDF库,禁止注释标签功能。