upload-labs上传靶场20关全关通关

0x00 环境要求

靶场下载地址:https://github.com/c0ny1/upload-labs/releases/download/0.1/upload-labs-env-win-0.1.7z

webshell及二次渲染图片马下载地址:

链接:https://pan.baidu.com/s/1ws7xwYysxGPqbwKu9SLfkg
提取码:ga4u

配置项配置描述
操作系统 Window or Linux 推荐使用Windows
PHP版本 推荐5.2.17 其他版本可能会导致部分Pass无法突破
PHP组件 php_gd2,php_exif 部分Pass依赖这两个组件
中间件 设置Apache 以moudel方式连接

 

0x01 绕过方式

 

0x02 通关思路

第一关

直接上传php文件判断限制方式:

通过响应时间判断 前端限制,通过回显内容判断是一个白名单限制。

 
第一关源码:

 

代码逻辑上检测了上传文件后缀是否是.jpg、.png、.gif

 

绕过思路:

1、删除前端检测函数

2、禁用前端js

3、抓包绕过前端限制

 

第二关

直接上传php文件判断限制方式:

 

通过回显判断应该是后端检测了上传文件的类型

 
第二关源码

 

代码逻辑限制了上传文件类型(Content-Type)

 

绕过思路:

1、抓包修改Content-Type为 image/jpeg 即可绕过

 

抓包上传:

 

修改Content-Type: application/octet-stream 为 Content-Type: image/png

 

第三关

直接上传php文件判断限制方式:

 

通过回显显示提示:不允许上传.asp,.aspx,.php,.jsp后缀文件!

可以尝试下这些后缀:php1、php2、php3、php4、php5、phtml

 

第三关源码

 

代码逻辑不允许上传.asp、.aspx、.php、.jsp等后缀

 

绕过思路:

1、尝试使用和php一样解析效果的后缀名,如php3、php4、php5、phtml等后缀名

 

抓包上传:

修改后缀为php1、php2、php3、php4、php5、phtml等后缀名,并尝试访问判断是否进行解析。

 

第四关

直接上传php文件判断限制方式:

 

通过回显判断,可能检测文件内容、文件后缀、文件类型等。

 
第四关源码

 

代码逻辑限制 $deny_ext里面是不允许上传的后缀文件,但是没限制 .htaccess 规则文件

 

绕过思路:

1、上传.htaccess 编写一个规则 指定xx文件为php执行

AddType application/x-httpd-php .png

或者
<FilesMatch "sss.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

 

先上传.htaccess规则文件

这里的意思是 当前目录下的ddd.jpg以php执行

 

上传一个ddd.jpg的一句话木马

 

第五关

直接上传php文件判断限制方式:

 

通过回显判断,可能限制了文件类型,但是抓包修改Content-Type: image/png 无法绕过,可能通过其他方式检测.

 

第五关源码

 

代码逻辑增加了.htaccess限制,但是大小写限制不全

 

绕过思路:

1、后缀名大小写混合

 

抓包上传:

 

第六关

直接上传php文件判断限制方式:

 

 

通过回显判断,可能检测文件内容、文件后缀、文件类型等。

 

第六关源码

 

代码逻辑少了一个首尾去空

 

绕过思路:

1、抓包文件名后面添加空格进行绕过(Windows特性绕过,Windows文件名后缀不允许有空格)

 

抓包上传:

文件名后缀添加一个空格

 

第七关

直接上传php文件判断限制方式:

 

通过回显判断,可能是文件类型限制,但不一定.

 

第七关源码

 

代码逻辑没有对后缀名进行去”.”处理,strrchr(file_name, '.')只是截取.后面的后缀名。利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过。少了代码file_name = deldot()删除文件末尾的.

 

绕过思路:

1、利用Windows特性会自动去掉后缀名中最后的.可在后缀名中加 . 绕过

 

抓包上传:

 

文件名后缀加 点 通过windows特性绕过上传限制

 

第八关

直接上传php文件判断限制方式:

通过回显判断,可能是文件类型限制,但不一定.

 

第八关源码

 

代码逻辑识别上传文件的类型 并查看是否是'.asp','.aspx','.php','.jsp'中的一个,否则不允许上传,少了代码file_ext = str_ireplace('::$DATA', '', file_ext);//去除字符串::$DATA

 

绕过思路:

1、NTFS文件系统包括对备用数据流的支持,主要包括提供与Macintosh文件系统中的文件的兼容性。备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为::$DATA。上传.php::$DATA绕过。(仅限windows)

 

抓包上传:

文件名扩展名添加::$DATA

 

第九关

直接上传php文件判断限制方式:

通过回显判断,可能是文件类型限制,但不一定.

 

第九关源码

 

代码逻辑查看源码,这里只过滤了一次,所以直接构造 .php. . 绕过

 

绕过思路:

1、直接构造点加空格加点 .php. . 绕过

 

抓包上传:

 

文件扩展名修改为.php. .

 

第十关

直接上传php文件判断限制方式:

 

 

这里直接上传php后缀,发现上传成功,查看审查元素的时候发现php没有了,猜测可能被替换了,那么这里的绕过可以通过双写进行绕过.

 
第十关源码
 

 

代码逻辑file_name = str_ireplace($deny_ext,"",$file_name) 把符合数组限制的后缀替换为空

 

绕过思路:

1、双写后缀绕过

 

抓包上传:

 

第十一关

直接上传php文件判断限制方式:

第十一关源码

 

../upload/123.php%00/52202206012025.gif

代码逻辑:

  • strrpos() 函数查找字符串在另一字符串中最后一次出现的位置

  • 是后缀名白名单,截取后缀名并随机命名拼接

 

绕过思路:

1、$_GET['save_path'] 控制上传目录,可以使用%00截断

 

00截断原理:

php是基础c语言实现的,C语言中认为0x00是结束符号,文件上传之所以可以00截断,是因为白名单判断的时候是判断后缀,在进行路径拼接的时候用的其他值,然后在进行move_uploaded_file的时候,这个函数读取到hex值为00的字符,认为读取结束,出现00截断

 

因为这里是通过url接受save_path参数,所以我们构造00截断 通过url编码进行构造 %00

 

第十二关

直接上传php文件判断限制方式:

 

第十二关源码

 

代码逻辑与前一关类似,只是变成了$_POST['save_path']控制上传目录

 

绕过思路:

1、0x00截断

 

抓包上传:

 

 

第十三关

直接上传php文件判断限制方式:

 

白名单限制,只允许上传.jpg .png .gif后缀文件

 

第十三关源码

 

 

代码逻辑通过读文件的前2个字节判断文件类型

 

绕过思路:

1、构建图片的文件头绕过

2、图片马绕过(需要配合文件包含漏洞)

 

第十四关

直接上传php文件判断限制方式:

同第十三关

 

第十四关源码

代码逻辑getimagesize获取文件类型,匹配是否是图片

 

绕过思路:

1、图片马绕过即可(需要配合文件包含漏洞)

 

第十五关

直接上传php文件判断限制方式:

同第十四关

 

第十五关源码

 

 

代码逻辑这里用到php_exif模块来判断文件类型

 

绕过思路:

1、图片马绕过(需要配合文件包含漏洞)

 

第十六关

直接上传php文件判断限制方式:

同第十五关白名单限制

 

第十六关源码

 

代码逻辑判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染

二次渲染图片马:https://xz.aliyun.com/t/2657#toc-13

 

绕过思路:

1、把经过二次渲染的图片进行捆绑webshell图片马,文件上传时候 文件名为.gif后缀、文件类型content-type:image/gif、文件头GIF89a

推荐使用gif格式,十六进制编辑图片文件找到二次渲染未修改的图片区域插入一句话木马

 

第十七关

直接上传php文件判断限制方式:

 

第十七关源码

代码逻辑:

  • 这里先将文件上传到服务器,然后通过rename修改名称,再通过unlink删除文件,因此可以通过条件竞争的方式在unlink之前,访问webshell

 

绕过思路:

1、条件竞争绕过上传webshell

上传一个fputs写入shell文件功能的webshell,通过python或者burpsuite访问该文件

f.php文件内容

<?php fputs(fopen('shell.php','w'),'<?php @assert($_POST[c]);?>'); ?>

 

burpsuite抓包:通过爆破形式不断的进行文件上传

burpsuite抓包:通过爆破形式不断的访问该文件

 

 

第十八关

直接上传php文件判断限制方式:

 

 

第十八关源码

 

代码逻辑对文件后缀名做了白名单判断,然后会一步一步检查文件大小、文件是否存在等等

 

绕过思路:

1、将文件上传后,对文件重新命名,同样存在条件竞争的漏洞。可以不断利用burp发送上传图片马的数据包,由于条件竞争,程序会出现来不及rename的问题,从而上传成功:

 

第十九关

直接上传php文件判断限制方式:

 

 

第十九关源码

 

代码逻辑file_name = _POST['save_name'];中有变量可控发现move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过

 

绕过思路:

1、0x00截断绕过

 

第二十关

直接上传php文件判断限制方式:

 

第二十关源码

 

1.更改mime类型

2.数组save_name分为三部分,save_name[0]是用于最后的命名。save_name[2]进行比对检测

 

绕过思路:

 

 

posted @ 2022-06-20 20:11  Saint_Michael  阅读(808)  评论(0编辑  收藏  举报