Pass-01-js检查
只能上传jpg|png|gif
js验证
上传php文件被拦截
删除js验证,上传成功
Pass-02-MIME-Type验证
文件有MIME-Type验证,可以用burpsuit抓包,修改Content-Type为image/jpeg
上传成功
Pass-03-黑名单验证
文件有黑名单需要绕过
用黑名单不允许上传.asp,.aspx,.php,.jsp后缀的文件
但可以上传.phtml .phps .php5 .pht
前提是apache的httpd.conf中有如下配置代码
AddType application/x-httpd-php .php .phtml .phps .php5 .pht
修改文件后缀名phtml,上传文件成功
Pass-04-黑名单验证(.htaccess)
黑名单拒绝了几乎所有有问题的后缀名,除了.htaccess
前提条件(1.mod_rewrite模块开启。2.AllowOverride All
)
因此先上传一个.htaccess文件,内容如下:
SetHandler application/x-httpd-php
这样所有文件都会当成php来解析
上传.htaccess
将php文件后缀名改为.gif,上传成功
Pass-05-黑名单验证(路径拼接绕过)
查看源码发现过滤了几乎所有后缀名,但没有对上传的文件进行重命名。
上传文件后缀名为.php. .
deldot删除最后一个点之后,不再进行删除,trim删除空格,那么最终上传的文件名为 1.php.。利用Windows自动去除最后一个点,导致成功上传1.php
使用bp修改后缀名上传成功
Pass-06-黑名单验证(大小写)
源码没有进行大小写后缀名过滤,可以将文件后缀名大小写绕过
Pass-07-黑名单验证(空格绕过)
源码没有去空格,可以在后缀名加空格绕过 php+
Pass-08-黑名单验证(点绕过)
源码没有去除点,可以通过点绕过
Pass-09-黑名单验证(特殊符号)
源码没有去除:: D A T A ,可以通过 : : DATA,可以通过:: DATA,可以通过::DATA绕过
Windows系统下,如果上传的文件名中test.php::$DATA会在服务器上生成一个test.php的文件,其中内容和所上传文件内容相同,并被解析。
文件路径删除::$DATA访问
Pass-10-黑名单验证(路径拼接绕过)
查看源码发现过滤了几乎所有后缀名,但没有对上传的文件进行重命名。
上传文件后缀名为.php. .
deldot删除最后一个点之后,不再进行删除,trim删除空格,那么最终上传的文件名为 1.php.。利用Windows自动去除最后一个点,导致成功上传1.php
使用bp修改后缀名上传成功
Pass-11-黑名单验证(双写绕过)
str_ireplace() 函数替换字符串中的一些字符(不区分大小写),只替换一次。
可以进行双写绕过1.pphphp
Pass-12-白名单验证(GET00截断)
0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。
GET型提交的内容会被自动进行URL解码。
使用00截断绕过
截断条件:php版本小于5.3.4,php的magic_quotes_gpc为OFF状态
在抓包头save_path.../upload/1.php%00
使用bp,将php文件后缀名改为1.png,并且GET路径后面添加2.php%00,上传
Pass-13-白名单验证(POST00截断)
在POST请求中,%00不会被自动解码,需要在16进制中进行修改00
./upload/2.php空格-》转到hex找到2.php-》把2.php后面的2020改为0000
Pass-14-图片马绕过
通过源码可知,服务器打开文件读取前两个字节,判断文件类型
针对这种情况可以直接新建文件改名1.jpg,其中代码内容如下
GIF98A
<?php
phpinfo();
?>
或
Windows制作webshell
copy 1.png/b+1.php/a shell.png
将图片上传
直接访问图片并不能把图片当做PHP解析,因此还需要利用文件包含漏洞
##include.php
<?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
include $file;
}else{
show_source(__file__);
}
?>
Pass-15-getimagesize图片马绕过
用getimagesize函数判断文件类型,还是可以图片马绕过,方法同pass-14
Pass-16-exif_imagetype()图片马
这里用到php_exif模块来判断文件类型,用图片马绕过,方法同pass-14
Pass-17-二次渲染绕过
判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染
制作一张图片马进行上传
使用010Editor查看webshell图片
查看上传的图片,发现图片被二次渲染,我们插入的代码<?php phpinfo(); ?>已经消失了
显然,这样的图片马上传方式失败了。
不过二次渲染会保留一些文件内容不会改变,所以在制作图片马之前,我们先观察二次渲染前后图片不会改变的地方,将其代码写入其中即可绕过二次渲染
Pass-18-条件竞争
这里是条件竞争,先将文件上传到服务器,然后判断文件后缀是否在白名单里,如果在则重命名,否则删除,因此我们可以上传1.php只需要在它删除之前访问即可,可以利用burp的intruder模块不断上传,然后我们不断的访问刷新该地址即可
Pass-19-条件竞争
因此也存在条件竞争的问题,不过这题对文件后缀名做了白名单判断,然后会一步一步检查文件大小、文件是否存在等等,因此可以通过不断上传图片马,由于条件竞争可能来不及重命名,从而上传成功。
Pass-20-00截断
//发现move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过
或
上传图片马,使用文件包含打开
Pass-21-数组绕过
可以使用图片马的方法
或
首先,判断文件的Content-Type类型是否在白名单中,如果不在禁止上传,如果在的话,继续往下执行。
如果POST接收的save_name为空,则赋值为$_FILES[‘upload_file’][‘name’],不为空就为本身
explode() 函数把字符串打散为数组
end()函数将 array的内部指针移动到最后一个单元并返回其值
reset()函数将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值
count() 函数计算数组中的单元数目或对象中的属性个数,这里要注意,数组下标从0开始
继续执行,如果$file不是数组则打乱成数组,如果是就往下执行
利用end函数将 f i l e 数组的最后一个单位赋值给 file数组的最后一个单位赋值给 file数组的最后一个单位赋值给ext
之后判断$ext是否在白名单内。在的话继续往下执行
将file数组的第一个元素用点拼接最后一个元素,赋值给$file_name,之后上传
这一关可以数组+/绕过
上传失败QAQ