一.漏洞描述
文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,对于攻击者来说很容易实施。文件上传漏洞本身就是一个危害巨大的漏洞,WebShell更是将这种漏洞的利用无限扩大。大多数的上传漏洞被利用后攻击者都会留下WebShell以方便后续进入系统。攻击者在受影响系统放置或者插入WebShell后,可通过该WebShell更轻松,更隐蔽的在服务中为所欲为。
二.漏洞成因
0x01前端验证
前端验证其实没必要多说,就是上传的时候上传文件的类型,后缀都是由前端JS验证的,而我们只要BurpSuite抓一下包就可以绕过客户端的这个验证。
0x02后端验证未严格化
由于后端验证大多数为黑名单验证,Content-Type验证,文件头验证。
当后端验证为黑名单时:我们可以找一下是否有文件后缀黑名单内未包括,但是解释器却把这个后缀解释为执行语言。(jsp jspx jspf asp asa cer aspx php php php3 php4 exe exee)
只验证了Content-Type:这时我们只要修改Content-Type:image/gif即可。
只是验证了文件头:可以随意找一个图片文件,直接右键文本打开,然后写入一句话即可。
0x03解析漏洞
IIS 5.x/6.0解析漏洞
IIS 6.0解析利用方法有两种
1.目录解析
/xx.asp/xx.jpg
在网站下建立文件夹的名字为.asp、.asa 的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。例如创建目录 sp.asp,那么/sp.asp/1.jpg将被当作asp文件来执行。假设黑阔可以控制上传文件夹路径,就可以不管你上传后你的图片改不改名都能拿shell了。
2.文件解析
sp.asp;.jpg
第二种,在IIS6.0下,分号后面的不被解析,也就是说sp.asp;.jpg会被服务器看成是sp.asp
还有IIS6.0 默认的可执行文件除了asp还包含这三种
/sp.asa
/sp.cer
/sp.cdx
IIS 7.0/IIS 7.5/ Nginx
在默认Fast-CGI开启状况下,黑阔上传一个名字为sp.jpg,内容为的文件,然后访问sp.jpg/.php,在这个目录下就会生成一句话木马shell.php
Nginx
影响版:0.5.,0.6., 0.7
Apache解析漏洞
其他
在windows环境下,xx.jpg[空格]或xx.jpg.这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点,黑客可以通过抓包,在文件名后加一个空格或者点绕过黑名单。若上传成功,空格和点都会被windows自动消除,这样也可以getshell。如果在Apache中.htaccess可被执行.且可被上传.那可以尝试在.htaccess中写入: SetHandler application/x-httpd-php 然后再上传shell.jpg的木马,这样shell.jpg就可解析为php文件。
三.漏洞利用
0x01检测javascript类型的绕过(客户端)
通常post请求发送到web服务器,客户端javascript验证。
上传1.php弹窗说上传格式错误,只允许.jpg,.jpeg等格式的文件
上传一句话1.php-->1.jpg 然后burp抓包1.jpg-->1.php,这样就绕过了js检测
F12查看源代码,找到onsubmit=”return checkFile()”,将它删除并编辑保存。
这个时候页面就不检测了,直接上传成功,
修改允许的函数checkfile(),添加我们想上传的文件格式,也是可以上传成功的。
0x02检测MIME类型的绕过(服务端)
服务端MIME类型检测(检测Content-Type内容),burp抓包,修改Content-Type
Content-Type:text/plain -->php
Content-Type:image/jpeg -->image
上传1.jpg--->修改image/jpeg为text/plain,成功绕过。
常见的MIME类型:
超文本标记语言文本.html text/html
xml文档 .xml text/xml
普通文本.txt text/plain
RTF文本 .rtf application/rtf
PDF文档 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG图像 .png image/png
GIF图形 .gif image/gif
JPEG图形 .jpeg,.jpg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
任意的二进制数据application/octet-stream
0x03检测目录路径类型的绕过(服务端)
上传1.jpg,burp进行抓包,Content-Disposition:from-data;name=”path”后面一行upload是我们保存的地址。现在我们将upload改为upload/1.php(空格) ,接着我们来到 Proxy->intercept->Hex找到1.php(空格)这个被修改过的代码,找到同一行的数字20,改为00 ,成功绕过wenshell:file:///C:\Users\ADMINI~1.1LK\AppData\Local\Temp\ksohtml\wDB.tmp.png
0x04检测文件内容的绕过(服务端)
检测内容是否合法或含有恶意代码
文件幻数检测
jpg-->JFIF
gif-->GIF89A
文件相关信息检测
常用的是getimaegsize()函数检测,有文件头,加一些杂乱的东西,空的地方添加木马
文件加载检测
API函数检测的, 一次渲染可以绕过,二次渲染就没戏绕过。
0x05检测黑名单类型的绕过(服务端)
将危险的后缀名写到一个文件里面,禁止指着后缀名的文件执行
文件名绕过:
大小写组合绕过pHp,PhP,混搭绕过php1,php2,php3,php4,php5
列表名绕过:
cer,ashx,asa,cer,cdx,htr,绕过(黑名单可能会漏掉的)
特殊字符绕过:
a.asp改成a.asp_
0x00截断绕过:
上传1.php.jpg burp抓包改成1.php%00.jpg,或者hex-->20改成00当解析的时候,看到空格,后面的那段就不解析了。或者upload/1.asp(空格)/上传,hex修改20-->00绕过上传
apache解析绕过:
help.asp.134.x2,从前向后尝试解析,直到遇到自己认识的扩展名为止。
双扩展名解析绕过:
apache的conf配置有AddHandler php5-script.php没有注释掉,文件名1.php.jpg就能当作php执行
.htaccess文件攻击:
自定义.htaccess上传,下面是内容
SetHandler application/x-httpd-php
同目录下,上传一个aaa文件,没有扩展名,内容是一句话,这个时候就成功绕过。
0x06检测白名单类型的绕过(服务端)
IIS 5.x/6.0解析漏洞
IIS 6.0解析利用方法有两种
1.目录解析
/xx.asp/xx.jpg
在网站下建立文件夹的名字为.asp、.asa 的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。例如创建目录 sp.asp,那么/sp.asp/1.jpg将被当作asp文件来执行。假设黑阔可以控制上传文件夹路径,就可以不管你上传后你的图片改不改名都能拿shell了。
2.文件解析
sp.asp;.jpg
第二种,在IIS6.0下,分号后面的不被解析,也就是说sp.asp;.jpg会被服务器看成是sp.asp
还有IIS6.0 默认的可执行文件除了asp还包含这三种
/sp.asa
/sp.cer
/sp.cdx
IIS 7.0/IIS 7.5/ Nginx
在默认Fast-CGI开启状况下,黑阔上传一个名字为sp.jpg,内容为的文件,然后访问sp.jpg/.php,在这个目录下就会生成一句话木马 shell.php
Nginx
影响版:0.5.,0.6., 0.7
Apache解析漏洞
其他
在windows环境下,xx.jpg[空格] 或xx.jpg. 这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点,黑客可以通过抓包,在文件名后加一个空格或者点绕过黑名单。若上传成功,空格和点都会被windows自动消除,这样也可以getshell。如果在Apache中.htaccess可被执行.且可被上传.那可以尝试在.htaccess中写入: SetHandler application/x-httpd-php 然后再上传shell.jpg的木马, 这样shell.jpg就可解析为php文件。
0x07自动修改后缀的绕过:
上传php,服务端自动修改成了gif,burp抓包,1.php-->修改成1.pphphp成功绕过。
四.漏洞防御
首先,上传的文件能够被Web容器解释执行。所以文件上传后所在的目录要是Web容器所覆盖到的路径。
其次,用户能够从Web上访问这个文件。如果文件上传了,但用户无法通过Web访问,或者无法得到Web容器解释这个脚本,那么也不能称之为漏洞。
最后,用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。
防范文件上传漏洞常见的几种方法。
文件上传的目录设置为不可执行
只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。
判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
使用随机数改写文件名和文件路径
单独设置文件服务器的域名
由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。
(如发现文章有问题,欢迎指正)
领取专属 10元无门槛券
私享最新 技术干货