upload-labs

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
2
$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");
$file_name = str_ireplace($deny_ext,"", $file_name); // 即那个文件后缀替换为空

​​       于是上传一个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
2
制作图片木马:copy 1.jpg /b + 1.php /a webshell.jpg 
其中b代表二进制,a代表ascii编码

Pass-14

​​       查看提示:本pass使用getimagesize()检查是否为图片文件

1
2
3
4
5
getimagesize() 函数用于获取图像大小及相关信息,成功则返回一个数组。

语法格式:array getimagesize ( string $filename [, array &$imageinfo ] )

getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。

​​       与上题绕过方式相同。

Pass-15

​​       查看提示:本pass使用exif_imagetype()检查是否为图片文件。

1
2
3
exif_imagetype() 读取一个图像的第一个字节并检查其签名,从而判断一个图像的类型

语法格式:exif_imagetype ( string $filename ) : int

​ ​       绕过方法同样与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. 先设置上传请求,文件名为 1.php

    2. 无参数需要爆破,故只需重复发起请求,设置访问次数为5000次,线程为50个

    3. 浏览器构造payload:http://web-labs.rinue.top/upload-labs/upload/1.php 进行访问,然后用burp抓包

    4. burp抓包后发送至intruder模块,然后设置payload,和第二步参数设置相同

    5. 设置好两个模块后同时启动,观察结果,当访问成功的时候,会返回PHP的配置信息。

Pass-18

​      ​ 本关对文件后缀做了白名单的判断,然后检查文件大小,文件上传后对文件重新命名,同样存在条件竞争的漏洞。仍然利用burp不断上传图片马的数据包,由于条件竞争,程序会出现来不及rename的情况,从而上传成功。

Pass-19

​​       查看提示:本pass的取文件名通过$_POST来获取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
pathinfo() 函数以数组的形式返回文件路径的信息

语法:pathinof(path, options)
options : PATHINFO_DIRNAME - 只返回 dirname;PATHINFO_BASENAME - 只返回 basename;
PATHINFO_EXTENSION - 只返回 extension

举例:<?php print_r(pathinfo("/testweb/test.txt"));?>
输出:
Array
(
[dirname] => /testweb
[basename] => test.txt
[extension] => txt
)

move_uploaded_file函数会忽略文件末尾的 /.
  • 可以利用move_uploaded_file的 \x00截断。即 post: save_name = 1.php%00.jpg
  • post: save_name = 1.php/. ,这样file_ext的值为空,可以绕过黑名单,函数忽略/. ,保存的文件类型为 .php

经典题型

  1. perl和ARGV任意文件读取

有哪些地方有问题的,望各位大佬指教。谢谢了!!!!

-------------本文结束感谢您的阅读-------------