Pass-01
上传类型为 jpg | png | gif的可以直接上传,类型为php的前端页面则提示 该文件不允许上传,请上传 .jpg|.png|.gif类型的文件
- 将要上传的php文件后缀改为允许的,然后在burp上面改回原来的
- 或者是浏览器禁用js后进行上传。
Pass-02
根据提示: 本pass在服务端对数据包的MIME进行检查。
查看源码,发现PHP代码只对content-Type进行了检查,在burp里面进行修改。
Pass-03
根据提示:本pass禁止上传 .asp|.aspx|.php|.jsp后缀文件。很显然这是一个黑名单绕过的题。可以通过用后缀为 .php3 .phtml .php5 .phps .pht .htaccess 文件进行绕过。
Pass-04
根据提示:本pass禁止上传了很多文件,但是 .htaccess 文件没有进行限制。于是我们可以来构造 .htaccess文件,内容为 SetHandler application/x-httpd-php 意思是可以让 .jpg格式文件以php格式进行解析。可以把要上传的php文件后缀名改为.jpg格式就可绕过了。
需要注意的是:.htaccess详解及.htaccess参数说明
Pass-05
观察之前的源码,都会发现下面的一句代码,但是本题显然没有,所以可以用大小写进行绕过。即上传一个1.PHP 文件
1 | $file_ext = strtolower($file_ext); // 转换为小写 |
Pass-06
观察源码,发现本题没有进行首尾去空格。
1 | $file_ext = trim($file_ext) // 首尾去空 |
于是上传一个1.php[空格] 文件
Pass-07
观察源码,发现本题没有去掉尾部的点。
1 | $file_ext = deldot($file_name); // 删除文件名末尾的点 |
于是上传一个1.php. 文件
Pass-08
观察源码,发现本题没有去处文件名的 ::$DATA
1 | $file_ext = str_ireplace('::DATA', '', $file_ext); // 去处字符串:::$DATA |
于是上传一个1.php::$DATA 文件
Pass-09
仔细查看源码,发现代码执行顺序为:删除文件名末尾的点 — 首尾去空,所以可以构造文件后缀后面为 . . 即上传一个1.php. . 文件
Pass-10
查看源码,发现文件后缀被替换为空,可以利用双写绕过。
1 | $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess"); |
于是上传一个1.pphphp 文件
Pass-11
查看提示:本pass上传路径可控。 查看源码,发现是白名单判断,文件存储路径为直接拼接而成,可以利用%00截断进行绕过。
1 | $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext; |
尽管方法是对的,但是老是提醒上传失败,烦人。
后来发现这里应该是php版本的问题了。%00截断 在5.3.4以后就修复了。
Pass-12
此题与上一题类似,只是将get改为了post, 故同样也可采用%00截断的方式绕过。
1 | $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext; |
此时文件路径在 POST数据里面,但是POST数据不能被url自动解码,所以需要在hex数据里面修改。为了方便找到位置,可以做个标记。
然后再hex里面找到对应 ) 的16进制 0d, 将其改为 00 ,即可。
当然也可以直接对%00进行url解码。
与上题一样,同样因为版本问题,上传失败。
Pass-13
查看提示:本pass检查图标内容开头2个字节。即通过检查文件头判断文件类型。绕过方法为:制作图片木马,将php语句隐藏在图片中,然后执行php.
1 | 制作图片木马:copy 1.jpg /b + 1.php /a webshell.jpg |
Pass-14
查看提示:本pass使用getimagesize()检查是否为图片文件
1 | getimagesize() 函数用于获取图像大小及相关信息,成功则返回一个数组。 |
与上题绕过方式相同。
Pass-15
查看提示:本pass使用exif_imagetype()检查是否为图片文件。
1 | exif_imagetype() 读取一个图像的第一个字节并检查其签名,从而判断一个图像的类型 |
绕过方法同样与13题相同。
Pass-16
查看提示:本pass重新渲染了图片。查看源码,发现代码先是判断了文件后缀和文件content-Type是否保持一致,然后用 imagecreatefrom[jpg][gif][png] 函数判断是否是图片格式,如果是的话再用image[jpg][gif][png]进行二次渲染。
本题较为困难,目前我只能完全理解上传gif格式文件,即像上述方法一样构造图片木马,然后将成功上传的图片下载到本地,对比二次渲染图片和原来上传的图片,会发现末尾的PHP代码消失了,重新将PHP代码写入到两张图片相同的地方,此时便是真正成功上传了带有PHP代码的图片了。至于png和JPEG格式的,参考链接 https://xz.aliyun.com/t/2657
Pass-17
查看提示:需要代码审计。查看源码发现,代码执行顺序为: 现将文件上传到服务器端,如果文件类型在白名单之类就重命名,不在的话就用UNlink进行删除。看别人写wp,都将这个叫做条件竞争。这个是之前没有接触过的。
绕过方法: 首先在burp不断发送上传webshell的数据包,然后不断在浏览器中访问,可以通过竞争访问到文件,但是缺陷是概率太低,经常会返回404.
之后找到了一个较为方便的方法(参照大佬):
用burp开启两个intruder模块,一个用于重复上传,另一个用于重复访问
先设置上传请求,文件名为 1.php
无参数需要爆破,故只需重复发起请求,设置访问次数为5000次,线程为50个
浏览器构造payload:http://web-labs.rinue.top/upload-labs/upload/1.php 进行访问,然后用burp抓包
burp抓包后发送至intruder模块,然后设置payload,和第二步参数设置相同
设置好两个模块后同时启动,观察结果,当访问成功的时候,会返回PHP的配置信息。
Pass-18
本关对文件后缀做了白名单的判断,然后检查文件大小,文件上传后对文件重新命名,同样存在条件竞争的漏洞。仍然利用burp不断上传图片马的数据包,由于条件竞争,程序会出现来不及rename的情况,从而上传成功。
Pass-19
查看提示:本pass的取文件名通过$_POST来获取。
1 | pathinfo() 函数以数组的形式返回文件路径的信息 |
- 可以利用move_uploaded_file的 \x00截断。即 post: save_name = 1.php%00.jpg
- post: save_name = 1.php/. ,这样file_ext的值为空,可以绕过黑名单,函数忽略/. ,保存的文件类型为 .php
经典题型
有哪些地方有问题的,望各位大佬指教。谢谢了!!!!