介绍
文件上传漏洞是指由于开发人员未对上传的文件进行严格的验证和过滤,而导致的用户可以越过其本身权限向服务器上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
漏洞产生的原因
- 对于上传文件的后缀名(扩展名)没有做较为严格的限制
- 对于上传文件的MIMETYPE(用于描述文件的类型的一种表述方法) 没有做检查
- 权限上没有对于上传的文件目录设置不可执行权限,(尤其是对于shebang类型的文件)
- 对于web server,对于上传文件或者指定目录的行为没有做限制
漏洞需要的前提条件
- 能上传木马
- 上传的木马能够被执行
- 清楚上传之后的路径
上传漏洞点基本流程
- 图片是否能正常上传
- 图片上传内容是否被感染(内容替换)
- 上传的域名是否是目标服务器(如果不是,判断图片服务器是否解析 php、asp、aspx、jsp、cfm、shtml等)
- 上传的目录是否支持解析php、asp、aspx、jsp、pht、phtml等
- 判断黑白名单验证
文件上传利用方式
1、准备一句话木马
2、上传至服务器
3、使用蚁剑链接webshell
4、成功拿到服务器shell
文件上传校验姿势
客户端
- JavaScript校验(一般只校验后缀名)
服务端
- 文件头content-type字段(image/gif)
- 文件内容头校验(GIF89a)
- 后缀名黑名单校验
- 后缀名白名单校验
- 自定义正则校验
- WAF设备校验(根据不同的WAF产品而定)
文件上传绕过姿势
客户端绕过
可以利用burp抓包改包,先上传一个jpg类型的木马,然后通过burp将其改为asp/php/jsp后缀名即可。
1、jpg文件内容写入一句话木马
2、更改后缀名,改为php
3、上传成功之后,使用蚁剑链接webshell
服务端绕过
文件类型绕过
通过抓包,将content-type字段改为image/gif
文件头绕过
在木马内容基础上再加一些文件信息
文件后缀名绕过
前提:黑名单校验
黑名单检测:一般有个专门的blacklist文件,里面会包含常见的危险脚本文件
配合文件包含漏洞
前提:校验规则只校验当文件后缀名为asp/php/jsp的文件内容是否为木马
绕过方式:
先上传一个内容为木马的txt后缀文件,因为后缀名的关系没有检验内容
然后再上传一个.php的文件,内容为<?php Include("上传的txt文件路径");?>,此时,这个php文件就会去引用txt文件的内容,从而绕过校验
配合操作系统文件命名规则
上传不符合Windows文件命名规则的文件名
a.asp.
a.asp(空格)
a.php:1.jpg
a.php::$DATA
a.php::$DATA
会被Windows系统自动去掉不符合规则符号后面的内容
CMS、编辑器漏洞
CMS漏洞:比如说JCMS等存在的漏洞,可以针对不同CMS存在的上传漏洞进行绕过
编辑器漏洞:比如说FCK,ewebeditor等,可以针对编辑器的漏洞进行绕过
配合其他规则
1、0x00截断:基于一个组合逻辑漏洞造成的,通常存在于构造上传文件路径的时候,路径/uploads/1.php(0x00),文件名1.jpg,结合/uploads/1.php(0x00)/1.jpg
2、.htaccess
上传当前目录的.htceecss文件,内容为:AddType application/x-http-php.jpg(上传的jpg均以php执行)
另一种写法
<FileMatch "shell.jpg">
SetHandler application/x-http-php
</FileMatch>
把.htaccess上传后,且上传成功后,再上传内容为一句话的jpg文件,会把jpg文件解析成php文件
其余配置问题导致漏洞
1、如果在Apache的conf里有这样一行配置AddHandlerphp5-script.php这时只要文件名包含.php,即使文件名是a.php.jpg也会以php来执行
2、如果在Apache的conf里有这样一行配置AddType application/x-http-php.jpg即使扩展名是jpg,一样能以php来执行。
服务器解析漏洞
IIS解析漏洞
使用iis5.x-6.x版本的服务器,大多为Windows server 2003,网站比较古老,开发语言一般为asp;该解析漏洞也只解析asp文件,而不能解析aspx文件。
形式:www.abc.com/xx.asp/xx.jpg
原理:服务器默认把xx.asp目录下的文件都解析成asp文件
文件解析
形式:www.abc.com/xx.asp;.jpg
原理:服务器默认不解析;号后面的内容,因此xx.asp;.jpg便被解析成asp文件
解析文件类型
IIS6.0默认的可以执行文件除了asp还包括这三种:
/test.asa
/test.cer
/test.cdx
Apache解析漏洞
Apache解析文件的规则是从右向左以此判断解析,如果后缀名为不可识别文件,就再往左判断。比如:test.php.owf.rar,“.owf”和“.rar”这两种后缀是Apache不可识别的,Apache就会解析成test.php
文件上传漏洞的防御方式
1.文件上传的目录设置为不可执行
只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。
2.判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
3.使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
4.单独设置文件服务器的域名
由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。