文件上传漏洞总结(全)

文件上传漏洞

凡是存在上传文件的地方,都有可能存在文件上传漏洞,并不是说有文件上传就一定有文件上传漏洞。

原理

这主要看一些文件上传的代码有没有 严格限制用户上传的文件类型,比如,只可以上传.jpg|.png|.gif文件,但是由于代码不严谨,或者只在前端验证这个文件的格式等等,造成了攻击者可以上传任意PHP文件,自定义文件。

危害

可以通过这个漏洞上传后门文件,webshell,可以直接获取网站权限,然后获取服务器的提权,获取内网权限,或去用户信息等等。属于高危漏洞。

查找:

黑盒:对方的网站情况,源码我们是不知道的。通过目录扫描获取到文件上传地址,功能查找,看网站有没有文件上传功能,比如会员中心上传头像等等。
白盒:有了源码,通过代码分析,本地测试。

利用思路:

常规类:扫描获取上传、会员中心上传、后台系统上传、各种途径上传。CMS类:已知CMS源码。编译器类:ckeditor、fckeditor、kindeditor、xxxxeditor。其他类/CVE:代码审计、平台/第三方应用。

文件上传常见验证

文件头的验证(文件内容的验证):属于间接验证,内容头信息,不严谨可通过抓包修改进行欺骗。

文件类型的验证:属于间接验证:MIME信息 也就是数据包中的content-Type类型。可以修改进行一个欺骗。不严谨。

后缀名的验证:属于直接验证,黑名单验证和白名单验证。黑名单就是明确不允许上传……文件类型,如:.asp、.php、.jsp、.aspx、.cgi、war文件。当然也得看情况是否支持。白名单就是明确只允许上传……文件,如:.jpg、.png、.gif、zip、rar文件,相对黑名单较安全。

思路

一.黑名单的绕过

1.有些黑名单定义的不可上传文件的后缀名不完整,可以用.php5、.phtml、.phps、.pht文件进行上传,从而实现绕过。

2.上传配置文件.htaccess,在这个文件写上代码
<FilesMatch “x.png”>
SetHandler application/x-httpd-php
如果有一个文件的名字是x.png,那么这个png文件就会被当作php文件进行解析,这样也可以实现绕过

3.大小写绕过将.phP文件名后缀大写

4.收尾去空绕过,在后缀名加空格(需要在抓到的数据包中加空格,直接在文件后缀名加空格会命名不成功,它会自动删除空格)

5.不删除末尾的点,在后缀名加点(需要在抓到的数据包中加点,直接在文件后缀名加点会命名不成功,它会自动删除点)

6.没有去除字符串::$DATA。如果文件名+”::$DATA”会把::$DATA之后的数据当成文件流处理,不会检测后缀名。例如:x.php::$DATA,Windows会自动去掉末尾的::$DATA变成x.php,但是这刚好就可以绕过黑名单了。

7.有时没有循环验证,只验证一次,可以使用x.php. .类似的方法进行绕过。(方法不止一种,视情况而定)

二.白名单的绕过

1.可以使用%00进行截断。%00只能用于php版本低于5.3的

2.图片马进行绕过

3.条件竞争进行绕过。
白名单要配合其他漏洞进行利用。

三.中间件之服务器

如果我们尝试上述的方法进行测试,发现网站确实没有漏洞,这时我们就可以对他的中间件进行测试。

1.IIS6.0版本

(1) 当建立.asa、.asp格式的文件夹时,其目录下的任意文件都将被IIS当作为asp文件解析。
(2) 当上传文件.asp;*.jpg IIS6.0会将文件当做asp文件解析。

2.apache低版本(2.x)

如果对方中间件是apache属于低版本,我们可以利用文件上传,上传一个不识别的文件后缀,利用解析漏洞规则成功解析文件,其中的后门代码被执行。例如:x.php.aaa.bbb.ccc.ddd,可以被当作php文件进行解析,从最后一个.ddd开始,apache不认识,就往前走,一直到.php,这样即绕过了验证,有可以进行解析。

3.apache换行解析漏洞(2.4.0–2.4.29)

在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。

4.Nginx低版本、II7

上传可以上传的文件,在文件地址后加上/x.php,可以让文件以php代码去执行。

5.Nginx文件名逻辑(0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7)

我们只需要上传一个空格结尾的文件,即可使PHP解析

四.中间件之编译器

可以参考://navisec.it/编辑器漏洞手册/

五.WAF绕过

如果对方有安全狗一些防护软件,我们应该如何进行绕过
1.要明确上传参数名哪些东西可以更改,哪些不可以
Content-Disposition:一般不可以更改
name:表单参数值,不能更改
filename:文件名,可以更改
Content-Type:文件mime,视情况更改

2.绕过方法
数据溢出,防匹配,比如:filename=“x.php”可以在名字上写入大量的立即数据,让安全狗匹配不到,filename=“aaaaaaaaaasssssssssssfggghgjghtuyrfuy6tfgufujfffx.php”,大量写入,我这里这个量是不够的,自行测试。
符号变异,防匹配,filename=“x.jpg;.php”
数据截断防匹配,(%00;换行)
重复数据防匹配(参数多次写入)

安全修复

1.后端验证:采用服务端验证模式
2.后缀验证:基于白名单,黑名单过滤
3.MIME验证:基于上传自带类型艰检测
4.内容检测:文件头,完整性检测
5.自带函数过滤
6.WAF防护软件:宝塔、云盾等