pass01 前端js绕过

上传php一句话木马,我们发现这里只能上传jpg,png,gif类型的文件
1-1
从代码不难看出这是JavaScript代码,禁用JavaScript,尝试上传
1-2
1-3
这一关也可以上传jpg后缀的一句话木马,通过前端验证后抓包修改上传的文件名后缀

pass02 content-type绕过

打开源码发现后端对数据包中的Content-Type进行了验证,那我们抓包修改数据包中的此项为可以验证成功的类别(image/jpeg、image/png、image/gif)即可
上传php文件
2-1
抓包修改文件类型
2-2
上传成功
2-3
2-4

pass03 特殊后缀绕过

这一关不能上传.asp,.aspx,.php,.jsp后缀文件
3-1
但在某些特定环境中某些特殊后缀仍会被当作php文件解析 php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml。这里尝试php3后缀,可以直接上传
3-2
3-3

pass04 .htaccess绕过

这一关过滤了很多后缀,但是没有对.htaccess进行过滤
4-1

1
2
3
4
.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
.htaccess主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。
.htaccess的用途范围主要针对当前目录。

绕过思路

1
2
3
4
5
6
7
8
9
10
11
创建.htaccess文件,代码如下:

方法一:
<FilesMatch "1.png">
SetHandler application/x-httpd-php
</FilesMatch>
#如果当前目录下有1.png,就会被解析为.php

方法二:
AddType application/x-httpd-php .png
#如果当前目录下有以.png结尾的文件,就会被解析为.php

这里我使用方法二,将所有的png文件都以php文件解析,先上传.htaccess文件,然后上传包含php代码的1.png文件
4-2

pass05 .user.ini绕过

这一关提示上传目录存在php文件,可以用到.user.ini文件上传漏洞
5-1
.user.ini上传漏洞的前提:.user.ini可以生效,并且该上传目录有php文件
漏洞原理:让上传目录下所有php文件在执行前预先加载指定文件
这一关符合漏洞前提

1
2
3
4
5
.user.ini 配置项中有两个配置可以起到一些作用
方法一:
auto_prepend_file = <filename> //包含在文件头
方法二:
auto_append_file = <filename> //包含在文件尾

构造.user.ini
auto_prepend_file = 1.png
上传.user.ini后上传1.png,访问readme.php即可
5-2

pass06 大写绕过

通过源码发现这关与前几关不同,没有将文件名转化为小写,且黑名单中的大写有限,我们构造黑名单中没有的大写后缀即可,如2.Php
6-1
上传成功,打开图片
6-2

pass07 空格绕过

打开源码发现这里与之前相比少了首位去空的代码,我们可以通过这个绕过文件名过滤
7-1
漏洞原理:黑名单里没有php空格的黑名单
上传1.php抓包在后缀名后加上空格
7-2
7-3

pass08 加点绕过

这里跟上一关相似,这里没有删除点的代码,我们在后缀加上点即可绕过
8-1
漏洞原理:Windows系统下,文件后缀名最后一个点会被自动去除
上传1.php抓包在后缀名后加上点
8-2
8-3

pass09 ::$DATA绕过

前置知识如图
9-1
漏洞原理:在php中不会验证附加数据流后缀
打开burp suite拦截选中1.php上传,修改数据包中的文件名后缀
9-2
上传成功打开图片,删除后缀::$DATA,因为windows服务器会自动删除附加数据流后缀
9-3

pass10 点空格点绕过

漏洞原理:后端在保存文件时,会先删除末尾的点,再删除空格,最后保存到windows时,系统自动删除末尾的点
10-1
10-2

pass11 双写后缀绕过

漏洞原理:这一关会根据黑名单删除文件名中的部分内容,但是只会检查一次,如果删除后的文件名中包含黑名单后缀,系统可能发现不了
.pphphp后缀,后端删除第一个遇到的php后,会将前面的p和后面的hp组合成一个新的php后缀,将php文件保存下来。
11-1
11-2

pass12 %00截断

前置知识:%00和0x00都表示空(null),一个再url中使用,一个是在编程语言中。
漏洞原理:在数据包中可以直接修改上传文件的保存路径,我们通过00截断修改上传路径即可保存文件。
上传php木马的png文件,修改保存路径为upload下1.php%00
12-1
12-2

pass13 0x00截断

第13关与12关思路一样使用白名单限制上传文件类型,但上传文件的存放路径可控,
但因为是POST型,需要对%00进行解码或在16进制中修改,POST不会像GET那样对%00进行自动解码。
通过burp suite对路径编码0x00
13-1
13-2

pass14 字节标识绕过

本关会读取判断上传文件的前两个字节,判断上传文件类型,并且后端会根据判断得到的文件类型重命名上传文件使用图片马+文件包含绕过
方法一:修改木马文件后缀,并修改头两个字节,jpg文件为ffd8,png为8950,gif为4749.
方法二:将木马文件添加到正常图片文件后。
方法一只需要用010editor编辑即可,这里只展示方法二。
构造三种类型的木马文件
copy pic.jpg/b+1.php hack.jpg
copy pic.png/b+1.php hack.png
copy 1.gif/b+1.php hack.gif
14-1
上传所有文件,记录下每张图片上传系统生成的随机文件名
2120250303200002.jpg 3320250303121415.png 7820250303200046.gif
打开文件包含网站,file设置为对应的文件名即可
14-2
14-3
14-4

pass15 图片马绕过

这一关采用getimagesize()检查是否为图片文件,不能使用字节标识绕过,可以使用图片马绕过,跟14关一样。
这里只展示部分图片
15-1

pass16 图片马绕过

exif_imagetype()读取一个图像的第一个字节并检查其后缀名。
返回值与getimage()函数返回的索引2相同,但是速度比getimage快
这里只展示上传的jpg文件
16-1

pass17 二次渲染绕过

本关综合判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染。
上传正常的gif图片下载回显图片(32243.gif),用010Editor编辑器修改渲染后的gif图片内容(因为渲染过的不会二次渲染),插入PHP一句话,利用路径文件包含成功。
17-1
jpg图片也同样可以
17-2
png有点复杂了,暂时先不弄

pass18 条件竞争绕过

漏洞原理:将文件上传到服务器,然后通过rename修改名称,再通过unlink删除文件,因此可通过条件竞争的方式在unlink之前,访问webshell。
使用burp拦截上传18.php的数据包并对数据包发送至intruder模块进行高速重发(上传包)

1
2
3
4
//18.php
<?php
fputs(fopen('shell.php','w'),'<?php phpinfo(); ?>');
?>

18-1
清除payload位置后,设置重复攻击,并配置线程
18-2
18-3
同时使用burp截取访问http://192.168.32.1/upload/upload/18.php的数据包也进行重发(访问包)
18-4
开启两个重放攻击之后,等一会儿就能在上传目录看到生成小马生成的shell.php
18-5
也可以访问shell.php
18-6

pass19 apache解析漏洞+条件竞争绕过

apache解析漏洞:Apache对文件名后缀的识别是从后往前进行的,当遇到不认识的后缀时,继续往前,直到识别。
点开源码,发现这一关会对后缀进行检查,直接上传php文件是不行的
19-1
利用apache解析漏洞我们可以将php文件上传,并通过条件竞争赶在文件重命名之前执行生成小马,生成shell.php
抓包修改文件名后缀,发送到intruder
19-2
同时使用burp截取访问http://192.168.32.1/upload/upload18.php.7z的数据包也进行重发(访问包)。注意,这一关在上传之前就对文件名进行了初步更改,且上传目录与前几关相比不太一样。
19-3
开启攻击之后,过一会儿就能访问shell.php了
19-4

pass20 后缀绕过总结

这一关比前几关简单,只会根据最后的点之后的后缀判断,用之前的方法就能成功,可以复习一下之前的绕过姿势。
后缀加点绕过
20-1
空格绕过
20-2
00截断、::$DATA、大写绕过、点空格点都行

pass21 审计+数组后缀绕过

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 = "请选择要上传的文件!";
}

源码逻辑:
1.检查MIME (通过抓包改Content-Type 绕过)
2.判断 POST参数 save_name 是否为空,
3.判断$file 是否为数组,不是数组以 .分割化为数组
4.取 $file 最后一个元素,作为文件后缀进行检查
5.取 f i l e 第 一 位 和 第 ‘ file 第一位和第file第一位和第‘file[count($file) - 1]作为文件名和后缀名保存文件
绕过方法:
修改content-type 修改POST参数为数组类型,
索引[0]为1.php,
索引[x]为jpg|png|gif。 x是最大索引
只要倒数第二个索引为空,
$file[count($file) - 1]就等价于$file[x-1],值为空绕过
21-1
21-2