Pass-01 前端验证
前端js验证,直接bp抓包绕过
Pass-02 content-type
修改content-type为:image/png 绕过
Pass-03 黑名单绕过
源码
1 | $is_upload = false; |
黑名单,采用php3 php5 phtml phps
绕过
Pass-04 .htaccess
源码
1 | $is_upload = false; |
过滤了所有后缀,可以利用.htaccess,上传一个.htaccess文件
1 | SetHandler application/x-httpd-php |
这样所有文件就会被解析成php
pass-05 大小写绕过
源码
1 | $is_upload = false; |
大小写绕过,.phP
pass-06 空格绕过
源码
1 | $is_upload = false; |
缺少过滤$file_ext = trim($file_ext); //首尾去空
1.php
绕过
pass-07 .绕过
源码
1 | $is_upload = false; |
缺少过滤$file_name = deldot($file_name);//删除文件名末尾的点
1.php.
绕过
pass-08 ::$DATA
源码
1 | $is_upload = false; |
缺少过滤$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
windows文件流特性::$DATA
之后的数据会当成文件流处理,保持::$DATA
之前的文件名1.php::$DATA
绕过
Pass-09 .[空格].绕过
源码
1 | $is_upload = false; |
deldot函数只去除了一个点1.php. .
绕过
Pass-10 双写绕过
源码
1 | $is_upload = false; |
$file_name = str_ireplace($deny_ext,"", $file_name);
仅是把黑名单匹配到的后缀去空1.pphphp
绕过
Pass-11 00截断
源码
1 | $is_upload = false; |
原理
admintony
在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束
要求
1 | php版本要小于5.3.4 |
Pass-12 00截断
源码
1 | $is_upload = false; |
Pass-13~15 图片马
方法一:winhex等工具打开图片直接添加到文件末
方法二:win:copy 1.jpg /b + 1.php /a 2.jpg
linux:cat 1.jpg 1.php >> 2.jpg
Pass-16 二次渲染
先知
即先上传一张gif,在下载,用winhex比较两张图片没有改变的部分,把一句话插入到该部分
payload
1 | <?php |
Pass-17 条件竞争
源码
1 | $is_upload = false; |
Pass-18 条件竞争
源码
1 | //index.php |
同Pass-17不断发包
因为move 在 rename 之前,可以通过条件竞争来使 rename 不成功即不重命名
Pass-19 CVE-2015-2348
源码
1 | $is_upload = false; |