一、客户端检测绕过
1,判断
按F12打开网络检测,提交一个非法格式的文件,若没有请求数据发送出去,直接判断出是非法格式则是客户端检测。
如图,只在客户端前端对文件格式是否为满足条件的png、bmp、gif、jpg进行了校验。
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name + "|") == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
将.php后缀改为符合前段检测的.jsp,抓包修改后缀名为php即可绕过前端校验,如果是JS校验也可以选择禁用浏览器JS绕过。
二、服务端MIME绕过
MIME检测的是数据包content-type字段。常见的图片格式的MIME类型有以下几种类型:
PNG图像:image/png
GIF图形: image/gif
JPG图形:image/jpeg
如下,将Content-TYpe修改为符合MIME检测的image/jpeg
蚁剑成功连接。可选择上传成功的裂图,右键复制图片地址到蚁剑连接,或抓包在返回包内查看地址,抓取返回包能对抗一些简单的上传重命名。
三、服务端目录检测绕过
在文件上传时,有的程序允许用户将文件放到指定的目录中,如果指定目录存在就将文件写入目录,不存在则先建立目录,然后写入。关键代码如下:
在HTML页面有一个隐藏的表单,它默认提交的文件夹名称为value的值,即”uploads”。代码如下:
利用:如果在上传文件的数据包中存在能操作上传路径的参数,可修改该参数配合解析漏洞getshell。
如利用条件:php<5.3.4 配置条件:php.ini:magic_quotos_gcp = Off
存在可控制上传路径的参数可结合其他姿势上传绕过, 如下,POST头内存在可控制上传路径的save_path参数,结合%00主动设置上传文件命名格式
四.黑名单
一.特殊文件名绕过
1.大小写绕过
2.空格绕过
使用burp抓包后在文件名后面加个空格
3.在文件后面加上’.’
对于windows系统,文件最后一个符号是’.'时会被丢弃。
4.在文件名后加上’. .’(点空格点)
5.在文件名后加上’::$DATA’
php+windows的情况下:如果文件名+::$DATA
会把::$DATA
之后的数据当成文件流处理,不会检测后缀名.且保持::$DATA
之前的文件名。利用windows特性,可在后缀名中加::$DATA
绕过。
6.双写绕过(不实用)
一些是把黑名单中的名字换成空格,则双写后缀名绕过。
7.使用%00
若上传路径可以控制,假如上传路径是:./upload/
修改为:./upload/1.php%00
在后端会把上传路径与文件名进行拼接,然后%00会把后面的内容进行截断,从而修改文件名称。
8.使用0x00截断
上传的文件名:在burp中修改空格的16进制把20改为00
1.php .jpg
二.上传配置文件绕过
1,.htaccess配置文件
例题:upload-lads第3,4题
文件名:.htaccess
内容:
<FilesMatch "自定义文件名">
SetHandler application/x-httpd-php
</FilesMatch>
只要上传的文件名包含自定义文件名,都会按照php来解析。
2,.user.ini配置文件(实用不大)
文件内容:
auto_prepend_file=1.jpg
代表的意思是,只要执行该目录下的php文件就包含1.jpg文件中的代码。
1.先上传个.user.ini文件,再上传个1.jpg内容是<?php phpinfo();?>
2.若上传目录中没有php文件则自己手动创建一个,空的php文件。
3.然后访问php文件就会执行1.jpg中的内容。
4.上传的文件只要含有.htaccess中自定义文件名就可以当作php来解析。
注意:
1.实用性不大:毕竟上传目录中一般不会有php可执行文件。
2.php要求版本较高,php5版本无法复现,使用php7可以。
三,文件包含
四,漏洞解析
IIS解析漏洞
IIS6.0有两个解析漏洞,一个是如果目录名包含.asp、.asa、 .cer字符串,那么这个目录下所有的文
件都会按照asp去解析。
eg: “test.asp/1.jpg”
另一个是只要文件名中含有.asp、 .asa、 .cer会优先按asp来解析
eg: “1.asp; . jpg”.
IIS7.0/ 7.5是对php解析时有一个类似于Nginx的解析漏洞 ,对任意文件名只要在URL后面追加
上字符串"/任意文件名.php”就会按照php的方式去解析。
eg:“http:/ /www. target. com/upload/1. jpg/1. php”
nginx解析漏洞
目前Nginx主要有这两种漏洞:
1.对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg
可以添加为test.jpg/x.php进行解析攻击。(实用)
例如:http://www.target.com/upload/1.jpg/1.php
2.对低版本的Nginx可以在任意文件名后面添加%00.php(条件苛刻)
例如:http://www.target.com/up1oad/1.jpg%00.php
对于nginx版本要求:
nginx 0.5. ;nginx 0.6.*;nginx 0.7 <= 0.7 .65;nginx 0.8 <= 0.8.37
五.白名单
一,0x00或%00截断
同黑名单中的内容
二,利用文件包含漏洞
条件:
当一些文件上传漏洞waf比较难以绕过,只能使用图片名后缀但图片内容没有进行重新渲染时。
原理:
只要图片中存在可以执行的php语句,即使文件名是图片的格式,只要使用include(‘xxx,jpg’);就可以把图片当做php文件来解析。
所以若可以配合文件包含漏洞将是一击重拳,很实用的。
三,漏洞解析
IIS解析漏洞
IIS6.0有两个解析漏洞,一个是如果目录名包.asp、.asa、 .cer字符串,那么这个目录下所有的文
件都会按照asp去解析。
eg: “test.asp/1.jpg”
另一个是只要文件名中含有.asp、 .asa、 .cer会优先按asp来解析
eg: “1.asp; . jpg”.
IIS7.0/ 7.5是对php解析时有一个类似于Nginx的解析漏洞 ,对任意文件名只要在URL后面追加
上字符串"/任意文件名.php”就会按照php的方式去解析。
eg:“http:/ /www. target. com/upload/1. jpg/1. php”
nginx解析漏洞
目前Nginx主要有这两种漏洞:
1.对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg
可以添加为test.jpg/x.php进行解析攻击。(实用)
例如:http://www.target.com/upload/1.jpg/1.php
2.对低版本的Nginx可以在任意文件名后面添加%00.php(条件苛刻)
例如:http://www.target.com/up1oad/1.jpg%00.php
对于nginx版本要求:
nginx 0.5. ;nginx 0.6.*;nginx 0.7 <= 0.7 .65;nginx 0.8 <= 0.8.37
四,文件内容检测
1.只检测文件头
php中一个检测函数getimagesize():可以检测一张图片的文件头,从文件头中判断照片的类型。所以,仅仅修改文件的后缀名是绕不过的。可以打开一张正常的图片,用记事本打开后在后面或者中间插入php语法。
制作图片马
windows下命令
copy 1.png/b+shell.php/a 2.png
1.png是正常的图片,shell.php是木马 2.png是新生成的图片马。
linu下命令:
cat 1.png shell.php >2.png
2.对文件内容进行检测
可能考虑用户体验,只会检测前多少行内容,然后就可以一直重复文件内容,在后面加入脚本语言进行绕过。
…/…/
http://192.168.18.129/dvwa/hackable/uploads/phpin.jpg
http://192.168.18.129/dvwa/vulnerabilities/fi/?page=…/…/hackable/uploads/phpin.jpg
http://192.168.18.129/dvwa/vulnerabilities/upload/