[upload-labs] 学习

一个帮你总结所有类型的上传漏洞的靶场

Pass-01

  • 在js中发现校验文件后缀的函数,我们添加php类型后在控制台更改然后上传shell

  • 上传shell之后在返回的数据中发现了shell的路径,然后用蚁剑连接即可

Pass-02

  • 这关是服务器验证,首先试了php后缀,当然是不行的,然后继续试了1.php.jpg是可以上传的,1.php.asd是不可以上传的,所以可以知道是白名单绕过,然后没思路看了提示和源码发现是检验了数据包的content-type,所以上传php的时候抓包修改content-typeimage/jpeg来绕过上传即可

Pass-03

  • 上传php的时候有个很明显的黑名单限制提示,尝试使用php3,phtml绕过,最后phtml成功绕过并解析

Pass-04

  • 不能上传php,但能上传php.jpg,php.asd,说明是黑名单限制,但是php3,phtml都被限制了,查看提示几乎所有可以绕过的后缀名都被限制了,但是唯独没有.htaccess,可以先上传一个.htaccess让所有文件解析为php,然后再上传一个图片马

  • htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

1
2
//.htaccess
SetHandler application/x-httpd-php

Pass-05

  • 不能上传php,.htaccess但能上传php.jpg,php.asd,说明是黑名单限制,查看源码发现与上一关少了统一大小写,所以用大小写绕过,上传phP文件绕过即可

Pass-06

  • 可以上传php.asd,黑名单限制,源码中没有去除空格所以可以上传.php 文件进行绕过

Pass-07

  • 可以上传php.asd,黑名单限制,源码没有去除文件名最后的.号,windows特性会自动去掉后缀名中最后”.”,于是可以构造.php.来绕过上传

Pass-08

  • 可以上传php.asd,黑名单限制,没有去除文件名后缀的::\$DATA, 同样可以利用 windows 特性, 在后缀添加::\$DATA即可绕过

Pass-09

  • 黑名单限制,咋一看好像可以绕过的都被限制了,但是仔细看最后拼接的文件名是处理后的文件名,所以可以上传”1.php. .”,经过处理后的文件名就变成”1.php.”,最后由于windows特性会将.自动去除来绕过

Pass-10

  • 黑名单过滤,上传时会去除php等字样,所以用双写绕过,构造.pphphp去除php后就变成.php

Pass-11

  • 白名单校验,但是图片路径是拼接的,所以可以用%00截断
1
2
3
//%00截断适用条件
PHP 版本 < 5.3.4
php.ini 中 magic_quotes_gpc=off

Pass-12

  • 这题跟上一题的不同就是保存路径从 GET方法变成了POST方法,此时不能再使用%00截断, 因为%00截断在 GET 中被 url 解码之后是空字符,但是在 POST 中%00不会被 url 解码, 所以只能通过burpsuite修改hex值为00进行截断

Pass-13

  • 题目要求上传图片马,源码是根据文件的前2个字节来判断文件类型,于是构造个图片马

  • 可以看到上传成功,后续利用就要配合文件包含了

Pass-14

  • 这里用了getimagesize()函数来检查图片,但是getimagesize也是根据文件头判断,所以跟上关一样就可以绕过了

Pass-15

  • 虽然换了exif_imagetype()检查,但是跟前两关一样就能绕过

Pass-16

  • 发现上传即使没通过也会将图片存在upload目录下,后面发现是作者一开始的逻辑没写好,即使没通过if循环也会因为move_uploaded_file函数将图片马上传到upload目录,所以我又重新下载了一份作者修改后的版本

  • 具体针对二次渲染的上传绕过可以看这篇文章upload-labs之pass 16详细分析,我试了下gif文件的绕过

  • 修改没有二次渲染后没有变动的地方

  • 利用文件包含成功执行php语句

  • jpg文件我试了好几次发现都会将php语句破坏一点

Pass-17

  • 查看源码发现存在条件竞争,在if判读不通过unlink文件之前已经用move_uploaded_file函数将文件上传到upload目录下,所以通过bp不断的上传weshell,然后在浏览器中不断的访问总能访问到未被unlink的webshell文件

Pass-18

  • 上传图片马时也存在条件竞争,有可能会未重命名

Pass-19

  • move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过

  • 上传成功

image.png

Pass-20

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
//检查MIME
$allow_type = array('image/jpeg','image/png','image/gif');
if(!in_array($_FILES['upload_file']['type'],$allow_type)){
$msg = "禁止上传该类型文件!";
}else{
//检查文件名
$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
if (!is_array($file)) {
$file = explode('.', strtolower($file));
}

$ext = end($file);
$allow_suffix = array('jpg','png','gif');
if (!in_array($ext, $allow_suffix)) {
$msg = "禁止上传该后缀文件!";
}else{
$file_name = reset($file) . '.' . $file[count($file) - 1];
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' .$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$msg = "文件上传成功!";
$is_upload = true;
} else {
$msg = "文件上传失败!";
}
}
}
}else{
$msg = "请选择要上传的文件!";
}
  • 这里smi1e师傅教我如何绕过(我要做smi1e师傅的舔狗),首先end函数取所post参数数组中的最后一个值,\$file_name = reset(\$file) . ‘.’ . \$file[count(\$file) - 1]我们可以post一个参数名为一个[0]一个[2],然后\$file[count(\$file) - 1]就为空,\$file_name最终就为reset(\$file)即$file[0],就可以绕过判断

  • 然后自动过滤.