FUSE & 文件上传漏洞自动化探测工具
2020-03-31 10:03:17 Author: www.4hou.com(查看原文) 阅读量:186 收藏

导语:这次介绍的是一篇发表在安全顶会NDSS 2020上的一篇paper,其针对文件上传漏洞的场景,实现了一款动态fuzz的工具FUSE,并利用其发现了现有33个CMS的15 CVE。

前言

这次介绍的是一篇发表在安全顶会NDSS 2020上的一篇paper,其针对文件上传漏洞的场景,实现了一款动态fuzz的工具FUSE,并利用其发现了现有33个CMS的15 CVE。

背景介绍

首先提几个关键的缩写含义,对于漏洞分类上,可以大致为两类,即:

UFU:为Unrestricted File Upload的缩写,含义即任意文件上传。

UEFU:为Unrestricted Executable File Upload的缩写,含义即任意可执行文件上传。

但这两类可能有一个子集的包含关系,UEFU应该为UFU的子集,因为我们上传的文件未必是可执行的。

然后是对于上传的恶意文件,我们也可以分为两类:

CE:为code execution的缩写,含义即为代码执行。

PCE:为potential code execution的缩写,含义即为潜在的任意代码执行。

一类就是代码执行的文件,这个非常容易理解,比如我们常见的一句话木马,而潜在代码执行的文件,可以理解成js等,需要引入或者满足一定条件的触发才会让其产生威胁。

而至于文件上传漏洞,作为一种危害性大,案例多的web漏洞,应该大家都比较熟悉了。那么其出现漏洞的位置也是多样化的,例如后缀名过滤产生的问题:

2020-03-27-10-07-36.png

我们可以看到黑名单过滤产生了2个弊端:第一是黑名单中的后缀名可能会有遗漏,第二是此处黑名单匹配并未使用大小写通配,从而会导致大小写Bypass。

同样的,漏洞也可能会是Content-Type过滤产生的问题:

2020-03-27-10-08-11.png

例如上述代码中,我们看到其会对Content-Type进行过滤,而Content-Type并不能真实反映文件的内容,是可通过burp等抓包工具进行拦截修改的,所以同样会产生安全隐患。

那么对于文件上传出现漏洞的多样性,其实对攻击者的探测产生了一些麻烦,我们在黑盒的情况下或者在找到上传点的情况下,可能需要通过大量的猜测和探测才能找到正确的Bypass模式,但实际上很多时候这是一种低效率的行为,有没有可能有一款类似sqlmap的工具,来自动化的fuzz上传接口呢?于是便有了FUSE这款工具。

工具设计

我们首先看一下工具的架构:

2020-03-27-10-10-26.png

那么实际上该工具的重点就在于其如何产生有效的payload和验证payload的攻击是否生效,首先我们先看其如何有效的产生payload:

2020-03-27-10-18-13.png

我们注意到,在一次文件上传的请求里,其实有很多位置是我们可以进行伪造更改的,因此作者将常见的文件上传bypass技巧归纳为如下多种模式:

2020-03-27-10-16-35.png

比如M3更改content-type,M4更改文件名后缀等等,当然我们肯定存在后端检测文件上传时,既检测content-type,又检测文件名后缀的情况,因此作者会对其进行排列组合进行测试:

2020-03-27-12-22-53.png

测试的时候,假如我们选定的seed模式为M1、M2、M3,那么工具会生成如上排列组合的模式,依次进行探测,从第一不修改任何参数进行恶意文件上传,到按照M1M2M3模式修改所有参数进行上传,当然如果其中某一种上传成功,那么自然不会去尝试包含这一种修改的修改,例如:

2020-03-27-12-25-50.png

当M1测试后,如果M1测试成功,我们的恶意文件已上传,那么则不会去尝试M1M3的组合,因为没有意义,其应该一定为成功。

当然这里可能涉及到相互冲突的问题,假设M1M3一起修改,可能会有冲突,所以考虑到这样的问题,工具也会进行筛选操作,例如M1和M2一起会产生冲突,那么M1M2和M1M2M3这两种排列组合不会进行组合修改。

2020-03-27-12-24-29.png

了解了payload的生成方式,我们再来看一下如何获取恶意文件上传后的路径,以用于检测是否攻击成功:

2020-03-27-10-16-00.png

工具有相应的config文件,其可以指定上传成功后的路径前缀,或者response里的路径url,以此正则去提取上传后的文件路径。当然作为一种修复文件上传漏洞的方案,常看见到文件名更改和路径的隐藏,上传者无法知道文件传到了何处,其文件名是什么。那么对于这一种情况,作者使用了一个文件监视器:

2020-03-27-12-30-26.png

该监视器运行在攻击目标服务器上,时刻监视该服务器上的文件创建。也是因为这一点,我个人认为FUSE可能更像一款动态fuzz的漏洞发掘工具,而非一款典型的渗透测试工具,因为这一需求我们在渗透测试中是肯定不会满足的,如果都有目标服务器的控制权限了,那么也没必要进行攻击了。所以这款工具的目标,更像去挖掘一些开源现有cms的文件上传漏洞。

然后是工具的运行逻辑:

2020-03-27-10-16-13.png

这就比较清晰了,即排列组合上述的payload,然后进行不断的上传测试,通过访问上传后的路径,判断文件是否上传成功。

实验结果

工具的作者关注点在于4种文件:php、html、xhtml、js,故此根据这4种文件,作者进行上传,以测试其是否允许CE或者PCE文件的上传。

首先数据集上,作者选取了33个CMS,并找到其中的文件上传点,然后利用工具进行动态fuzz,得到如下结果:

2020-03-27-10-16-57.png

我们从结果里可以看到,其中有9个cms是需要文件监视器的,即上传后的文件路径和文件名难以被攻击者直接获取。同时我们发现PCE中只有php和js,这可能是因为php文件虽然上传成功,但未必能被直接解析,其可能受到.htaccess的影响,而导致其只能是潜在的代码执行文件,可能需要配合任意文件删除漏洞,才能发挥作用。而对于js,其一般是需要被html等调用触发,才能造成一系列的攻击,故其也作为了一种PCE文件。

当然除此之外,该工具有测试尝试上传了.htaccess文件,我们知道.htaccess是可以更改apache子目录配置的,其可以指定将jpg后缀按照php进行解析等,很容易导致组合拳形式的bypass,所以对其的测试是很有必要的,我们也可以看到在上述CMS中,有6个CMS是允许.htaccess上传的,这是相当危险的。

后记

FUSE这款工具我个人认为,其定义应该为文件上传界的sqlmap,但由于其较强的约束条件,可能在实战黑盒测试中作用有限,应对会修改文件名和文件路径,或做隐藏的安全保护,是比较难以突破的。

工具开源在:https://github.com/WSP-LAB/FUSE

本文为 一叶飘零 原创稿件,授权嘶吼独家发布,如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/BRxN
如有侵权请联系:admin#unsafe.sh