upload靶场下载地址:https://github.com/c0ny1/upload-labs

在客户端使用js脚本对文件后缀名检验,抓包更换后缀名即可

文件上传成功

服务端对MIME类型检验,抓包更换image/jpeg即可

文件上传成功

对后缀名进行黑名单判断,抓包修改后缀名为.php3 | .phtml | .php5等即可
前提:
apache的配置文件httpd.conf中有如下配置
AddType application/x-httpd-php .php .php3 .php5 .phtml

文件上传成功

黑名单判断,没有限制.htaccess文件,可以利用apache解析漏洞
先上传.htaccess文件,在上传jpg文件,那么所有的jpg文件都会被当作php文件执行
httpd.conf:AllowOverride All
.htaccess文件内容:SetHandler application/x-httpd-php .jpg
上传.htaccess文件

上传jpg文件

文件上传成功

源码中没有过滤大小写,可以进行绕过上传


源码中少了首尾去空这一行代码,可以在后缀名后面增加空格


源码中少了删除文件名末尾的点这一行代码,可以在后缀名后面加一个点,进行绕过


源码缺少::$DATA限制,在php+windows的情况下:如果文件名+::$DATA会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持::$DATA之前的文件名。利用windows特性,可在后缀名中加::$DATA绕过


代码先是去除文件名前后的空格,再去除文件名最后所有的.,再通过strrchar函数来寻找.来确认文件名的后缀,但是最后保存文件的时候没有重命名而使用的原始的文件名,导致可以利用phpinfo.php. .(点+空格+点)来绕过


源码中,后缀名替换为空只替换一次,使用复写后缀名进行绕过


截断条件:php版本小于5.3.4,php的magic_quotes_gpc为OFF状态


save_path参数通过POST方式传递,还是利用00截断,因为POST不会像GET对%00进行自动解码,所以需要在二进制中进行修改。

修改前

修改后

成功上传




getimagesize()函数判断文件类型,还是可以图片马绕过,方法同上


用php_exif模块来判断文件类型,用图片马绕过,方法同pass-13
参考链接:https://www.cnblogs.com/cookies9/p/9209252.html


就是根据用户上传的图片,新生成一个图片,将原始图片删除,将新图片添加到数据库中。比如一些网站根据用户上传的头像生成大中小不同尺寸的图像。
我们需要知道,新生成的图片和原图片有什么不同,在相同的地方(不被渲染的地方)插入代码进行绕过
参考链接:https://xz.aliyun.com/t/2657#toc-13
找到两张图片相同的地方写入代码

将写入代码的图片上传

通过源码得知,先将文件上传到服务器,然后判断文件后缀是否在白名单里,如果在则重命名,否则删除
参考链接:https://cloud.tencent.com/developer/article/1650655
使用Intruder模块进行重复发包

使用python去访问上传的文件

访问到后,停止发包,成功连上webshell

审查源码发现,对文件后缀名做了白名单判断,然后会一步一步检查文件大小、文件是否存在等等,因此可以通过不断上传图片马,由于条件竞争可能来不及重命名,从而上传成功。



原文:https://www.cnblogs.com/starci/p/15179558.html