upload靶场下载地址:https://github.com/c0ny1/upload-labs
Pass-01 JS前端校验
在客户端使用js脚本对文件后缀名检验,抓包更换后缀名即可
文件上传成功
Pass-02 MIME类型校验
服务端对MIME类型检验,抓包更换image/jpeg即可
文件上传成功
Pass-03 黑名单绕过
对后缀名进行黑名单判断,抓包修改后缀名为.php3 | .phtml | .php5等即可
前提:
apache的配置文件httpd.conf中有如下配置AddType application/x-httpd-php .php .php3 .php5 .phtml
文件上传成功
Pass-04 .htaccess文件绕过
黑名单判断,没有限制.htaccess文件,可以利用apache解析漏洞
先上传.htaccess文件,在上传jpg文件,那么所有的jpg文件都会被当作php文件执行
httpd.conf:AllowOverride All
.htaccess文件内容:SetHandler application/x-httpd-php .jpg
上传.htaccess文件
上传jpg文件
文件上传成功
Pass-05 大小写绕过
源码中没有过滤大小写,可以进行绕过上传
Pass-06 空格绕过
源码中少了首尾去空这一行代码,可以在后缀名后面增加空格
Pass-07 点绕过
源码中少了删除文件名末尾的点这一行代码,可以在后缀名后面加一个点,进行绕过
Pass-08 ::$DATA绕过
源码缺少::$DATA
限制,在php+windows的情况下:如果文件名+::$DATA
会把::$DATA
之后的数据当成文件流处理,不会检测后缀名.且保持::$DATA
之前的文件名。利用windows特性,可在后缀名中加::$DATA
绕过
Pass-09 点+空格+点 绕过
代码先是去除文件名前后的空格,再去除文件名最后所有的.
,再通过strrchar函数来寻找.
来确认文件名的后缀,但是最后保存文件的时候没有重命名而使用的原始的文件名,导致可以利用phpinfo.php. .
(点+空格+点)来绕过
Pass-10 双写绕过
源码中,后缀名替换为空只替换一次,使用复写后缀名进行绕过
Pass-11 %00截断
截断条件:php版本小于5.3.4,php的magic_quotes_gpc为OFF状态
Pass-12 %00截断
save_path参数通过POST方式传递,还是利用00截断,因为POST不会像GET对%00进行自动解码,所以需要在二进制中进行修改。
修改前
修改后
成功上传
Pass-13 图片头欺骗
Pass-14 getimagesize()图片马
getimagesize()
函数判断文件类型,还是可以图片马绕过,方法同上
Pass-15 exif_imagetype()图片马
用php_exif
模块来判断文件类型,用图片马绕过,方法同pass-13
参考链接:https://www.cnblogs.com/cookies9/p/9209252.html
Pass-16 图片二次渲染
就是根据用户上传的图片,新生成一个图片,将原始图片删除,将新图片添加到数据库中。比如一些网站根据用户上传的头像生成大中小不同尺寸的图像。
我们需要知道,新生成的图片和原图片有什么不同,在相同的地方(不被渲染的地方)插入代码进行绕过
参考链接:https://xz.aliyun.com/t/2657#toc-13
找到两张图片相同的地方写入代码
将写入代码的图片上传
Pass-17 条件竞争
通过源码得知,先将文件上传到服务器,然后判断文件后缀是否在白名单里,如果在则重命名,否则删除
参考链接:https://cloud.tencent.com/developer/article/1650655
使用Intruder模块进行重复发包
使用python去访问上传的文件
访问到后,停止发包,成功连上webshell
Pass-18
审查源码发现,对文件后缀名做了白名单判断,然后会一步一步检查文件大小、文件是否存在等等,因此可以通过不断上传图片马,由于条件竞争可能来不及重命名,从而上传成功。