【upload-labs通关详解】


前言

upload-labs是一个使用php语言编写的,专门收集渗透测试过程中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共21关,每一关都包含着不同上传方式。


一、Pass-01

提示:本pass在客户端使用js对不合法图片进行检查!
方法:burp抓包修改后缀名
php代码:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

二、Pass-02

提示:本pass在服务端对数据包的MIME进行检查!
方法:修改mime类型绕过
在这里插入图片描述

三、Pass-03

提示:本pass禁止上传.asp|.aspx|.php|.jsp后缀文件!
方法:上传PHP文件的别名进行黑名单绕过
注意:这里虽然可以用php3,php5,phtml等后缀名绕过,但前提是网站能够解析
phpstudy的配置文件需要修改,打开phpstudy的httpd-conf配置文件,修改

AddType application/x-httpd-php .php .phtml .php5 .php3

注意前面的#要删除,这时即可正常访问。

在这里插入图片描述

四、Pass-04

提示:本pass禁止上传许多后缀名的文件
方法:.htaccess文件绕过
.htaccess文件代码:

<FilesMatch "test.jpg">
Sethandler application/x-httpd-php
</FilesMatch>

代码中未限制.htaccess文件上传,上传以上内容的.htaccess文件后会将test.jpg当成PHP文件解析执行。

五、Pass-05

提示:上传目录存在php文件(readme.php)
方法:php后缀名黑名单绕过
查看源码

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

分析:和Pass-04一样,代码中只过滤了一次点,删除了空格和::$DATA,将文件后缀改为小写,黑名单等,使用Pass-04的方法绕过即可,但黑名单中屏蔽了.htaccess文件。
exp:文件名改为“test.php. . ”

六、Pass-06

提示:禁止了很多后缀名文件上传
方法:php后缀名大小写绕过
查看源码,和之前对比,发现这关没有转换大小写的代码,这样我们就可以上传大小写混合的后缀名来进行绕过。
exp:文件名改为“test.Php”

七、Pass-07

提示:禁止了很多后缀名文件上传
方法:php后缀名空格绕过
分析:代码中未用trim()去除首尾空格,截包时文件名后加空格绕过即可。
exp:文件名改为“test.php ”

八、Pass-08

提示:本pass禁止上传所有可以解析的后缀!
方法:php后缀名点绕过
分析:代码中未用deldot()去除点,使用BurpSuite截包,文件名后加点绕过即可。
exp:文件名改为“test.php.”

九、Pass-09

提示:禁止了很多后缀名文件上传
方法:php后缀名::$DATA绕过
分析:代码中未用str_ireplace()过滤::$DATA数据流标记,在BurpSuite中加入::$DATA到文件名末尾即可。在访问时去掉URL中的::$DATA。
exp:文件名改为“test.php::$DATA”

十、Pass-10

提示:本pass只允许上传.jpg|.png|.gif后缀的文件!
方法:php后缀名点空格点绕过
分析:只过滤了一次点,使用老方法“点+空格+点”过滤。保存路径没有经过处理。
exp:文件名改为“test.php. .”

十一、Pass-11

提示:本pass会从文件名中去除很多后缀名
方法:php后缀名复写绕过
分析:Pass-11的防护方法是将出现在黑名单中的后缀名替换成空白字符串,但无论文件名是否被匹配都会被上传。鉴于源代码中只过滤了一次,我们可以使用双写绕过方法上传(如:.jjspsp)。这样str_ireplace()函数会将字符串“jsp”替换为空白,但替换后剩下的字符串刚好为“.jsp”。
exp:文件名改为“test.pphphp”

十二、Pass-12

提示:本pass上传路径可控!
方法:00截断(get方法)
分析:Pass-12首先提取了文件后缀名,只允许上传图片文件,但上传路径是可控的,所以我们可以使用%00截断漏洞将上传路径改为文件名。
当使用了截断漏洞时,传入的文件名为shell.php%00shell.jpg,检测时发现后缀为.jpg,所以没有过滤;
保存时由于使用了%00截断,%00后面的字符串不生效,所以最后保存的文件名是shell.php。
注:过本Pass,PHP版本<5.3.4,php.ini中关闭magic_quotes_gpc选项。
在这里插入图片描述

十三、Pass-13

提示:本pass上传路径可控!
方法:00截断(post方法)
分析:本Pass考察基于POST方法的截断上传攻击。POST方法较为特殊,直接在明文中添加%00不会被服务器解码,我们需要修改HTTP包中上传路径对应的十六进制值(改为00)进行截断攻击,其原理与Pass-12相同。
在这里插入图片描述这里可选择%00右键convert selection即可进行快速url编码
在这里插入图片描述

十四、Pass-14

提示:本pass检查图标内容开头2个字节!
方法:上传图片码

注意:
1.保证上传后的图片马中仍然包含完整的一句话或webshell代码。
2.使用文件包含漏洞能运行图片马中的恶意代码。
3.图片马要.jpg,.png,.gif三种后缀都上传成功才算过关!
4.PHP版本>5.3。
5.必须在php.ini中开启allow_url_fopen选项。

可以直接用notepad打开一个图片在后面添加代码组成图片马,也可以使用cmd命令。

copy test.jpg /b + test.php /a webshell.jpg

本题只检查文件头信息是否符合图片文件的文件头,所以不能使用改后缀名之类的方法。由于PHP文件可以包含纯文本内容,包括以纯文本形式打开图片出现的乱码的特性,可以使用include()函数包含图片,如果图片中有PHP代码,include()函数会进行解析。

制作图片码后上传,利用文件包含漏洞访问即可

十五、Pass-15

提示:本pass使用getimagesize()检查是否为图片文件!
方法:上传图片码,GIF89a绕过
查看源码,关键函数是这个getimagesize
getimagesize函数会对目标的十六进制的前几个字符串进行读取。比如GIF的文件头问GIF89a,png的文件头为塒NG。所以这关和第十三关一样,我们只需要用notepad打开图片马,在前面加上GIF89A,保存为webshell.gif,然后直接上传成功。用文件包含漏洞打开图片。

十六、Pass-16

注意:必须开启php_exif模块。
提示:本pass使用exif_imagetype()检查是否为图片文件!
方法:上传图片码
分析:不管用什么PHP函数检测图片,只要图片木马能在本地用照片浏览器正常地打开,就能用文件解析漏洞绕过。
直接采用上一关方法绕过

十七、Pass-17

注意:必须开启php_exif模块。
提示:本pass重新渲染了图片!
方法:上传图片后将原图与渲染后的图片进行比较,在没有被渲染的地方插入php代码

1.PHP版本>5.3。
2.必须在php.ini中开启allow_url_fopen选项。
3.必须开启php_exif模块。

imagecreatefromjpeg()函数,二次渲染是由Gif文件或 URL 创建一个新图象。成功则返回一图像标识符/图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败。
按照前几关的方式上传,可以上传,但是包含漏洞无法解析。原因就是二次渲染将图片马里面的php代码删了。接下来把原图和修改后的图片进行比较,看哪里没有被渲染,在这里插入php代码。
推荐使用beyond compare。为了方便大家测试,这里再推荐网上大佬的二次渲染专用图片https://wwe.lanzoui.com/iFSwwn53jaf
在这里插入图片描述

十八、Pass-18

提示:需要代码审计!
方法:条件竞争绕过
源代码:

$is_upload = false;
$msg = null;if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;    if(move_uploaded_file($temp_file, $upload_file)){
        if(in_array($file_ext,$ext_arr)){
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
             rename($upload_file, $img_path);
             $is_upload = true;
        }else{
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
            unlink($upload_file);
        }
    }else{
        $msg = '上传出错!';
    }
}

分析:本Pass先创建了一个只包含图片文件的白名单,随后提取出文件的后缀名,将文件移动至上传目录后再判断是否合法,不合法就删除。我们可以使用条件竞争方法(即在文件被删除之前访问该文件)绕过。此方法需要不停且迅速地上传、访问文件。我们使用BurpSuite和Python进行上传和访问。
python脚本如下:

import requests
url="http://127.0.0.1/upload-labs/upload/shell.php"
while True:
	web_result=requests.get(url)
	if web_result.status_code == 200:
		print("Success")
		break
	else:
		print("Failed")

shell.php代码如下:

<?php 
	$file=fopen("phpinfo.php","w");
	fputs($f,'<?php phpinfo(); ?>');
?>

上传后使用BurpSuite截包,按Ctrl+I发送至Intruder,设置Payload type为Null payloads,Payload Options设置为Continue indefinitely,不断上传该文件,随后运行脚本不断访问该文件。
看到Success即上传成功,访问phpinfo.php即可。

十九、Pass-19

提示:需要代码审计!
方法:上传图片码
注意:必须使用文件包含漏洞配合图片木马! 必须在php.ini中开启allow_url_include选项!
这关不知道是作者的什么原因,导致这里有个错误。上传的图片放不到upload下,这里进行一个小小的改动,打开18关的myupload.php,修改如下,重启靶场即可。
在这里插入图片描述
分析:本Pass做了白名单校验,文件上传后先保存在对象中,随后对文件进行判断存在、检查扩展名、检查大小、重命名、移动操作,没有判断文件头和二次渲染。我们可以使用图片木马配合文件包含漏洞进行绕过。(虽然进行了移动和重命名,但是网页会回显地址)
exp:直接将shell.php改为shell.jpg,上传,随后使用文件包含漏洞访问该文件(本Pass将文件上传至根目录下)

二十、Pass-20

提示:本pass的取文件名通过$_POST来获取。
方法:后缀名大小写绕过
源代码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

        $file_name = $_POST['save_name'];
        $file_ext = pathinfo($file_name,PATHINFO_EXTENSION);

        if(!in_array($file_ext,$deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) { 
                $is_upload = true;
            }else{
                $msg = '上传出错!';
            }
        }else{
            $msg = '禁止保存为该类型文件!';
        }

    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

分析:本Pass只对保存名进行黑名单判断,该做的防护全部没做。所以我们进行大小写绕过,使用BurpSuite截包,直接将保存名改为test.Php即可绕过。

二十一、Pass-21

提示:Pass-21来源于CTF,请审计代码!
这关参考大佬解法,呜呜。
分析:
本Pass做了如下校验:
1.验证MIME类型(这个很好解决)
2.验证文件名。
验证文件名操作如下:

empty()配合三运运算符检查文件名是否为空。
如果$file不为数组则将$file打散为数组。(这步很关键)
end()函数提取数组最后一个元素为后缀名。
确定白名单
将文件名设置为数组索引为零的元素与数组索引为元素总个数减一的元素合并。
上传、改名、移动。

第二步使用if判断$file是否为数组,是则跳过,不是则打散为数组。所以我们可以在上传中途控制save_name参数,随意操作POST数组索引进行绕过,这样$file已经是数组,不会被重新打散。

exp:
先将Content-type改为image/jpeg
reset()取数组索引为0的元素为文件名,所以将save_name[0]设置为“shell.php”。
save_name[1]不设置,使count()结果为2。
save_name[2]为jpg。
拼接结果为shell.php,$ext值为jpg。

---------------------------137391628912056871743305130682
Content-Disposition: form-data; name="upload_file"; filename="shell.jpg"
Content-Type: image/jpeg<?php phpinfo(); ?>
-----------------------------137391628912056871743305130682
Content-Disposition: form-data; name="save_name[0]"shell.php
-----------------------------137391628912056871743305130682
Content-Disposition: form-data; name="save_name[2]"jpg

最后附上解题思维导图,加深记忆:
在这里插入图片描述


总结

本期为大家带来upload-labs靶场通关全解,希望能对你有帮助!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一纸-荒芜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值