upload-labs靶场1-21关一些思路

本文提供upload-labs靶场1-21关的详细绕过思路与技巧,包括JS绕过、Content-Type绕过、黑名单检测绕过等多种手段,并分享了通过不同类型的文件上传漏洞获取服务器权限的过程。

upload-labs靶场1-21关一些思路

1、js绕过,后缀名绕过

image-20210711221806460

查看源码分析,允许上传的文件类型为.jpg|.png|.gif,可以抓包修改后上传

image-20210711222336626

修改后缀为php即可

image-20210711222400510

放包然后可以看到页面成功上传

image-20210711222516001

返回了地址,下面就可以利用工具进行连接了。

image-20210711222653626

这里看到地址 …/upload/2.php 这里…/是上一目录的意思

所以地址是http://ip/upload-labs/upload/2.php 口令是sb

用蚁剑连接如图,测试连接数据返回成功

image-20210711222949529

然后点击添加成功查看目录并且能访问所以有权限的文件了

image-20210711223050611

记得及时删除文件

image-20210711223348692

删除之后会里面连接失效,然后进行下一题吧

第一关还有一个解法是删除js验证,删除这个语句后即可直接上传php

image-20210711223450659

上文这里打码部分就是自己的本地ip,cmd里输入ipconfig即可查看,下文均已替换,可能有几个,随机选就行,当然,得先开启你的phpstudy噢

image-20210711230806924

image-20210711230932985

2、Content-Type绕过

查看源码发现是对content-type做了限制,用第一关的第一种方法即可成功

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists($UPLOAD_ADDR)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
                $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
                $is_upload = true;

            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = $UPLOAD_ADDR.'文件夹不存在,请手工创建!';
    }
}

这里的限制就是Content-Type满足条件即可,抓包改后缀名即可,如下划线部分,满足条件,然后修改后缀名即可绕过。

image-20210711224721223

3、黑名单检测(特殊16进制后缀绕过)

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists($UPLOAD_ADDR)) {
        $deny_ext = array('.asp','.aspx','.php','.jsp');
        $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)) {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR. '/' . $_FILES['upload_file']['name'])) {
                 $img_path = $UPLOAD_ADDR .'/'. $_FILES['upload_file']['name'];
                 $is_upload = true;
            }
        } else {
            $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
        }
    } else {
        $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
    }
}

查看源码发现基本上什么限制都搞上了,后缀名做了很高的限制,想到可以上传php3、php5、phtml等文件去绕过黑名单,但是apache的配置文件无法解析。

这里尝试上传.htaccess文件,内容为SetHandler application/x-httpd-php,是成功上传的,但是被重命名了,则无法利用

image-20210711225623068

直接上传成功了,接下来直接上传图片马

image-20210711225639667

用蚁剑连接

image-20210711225726805

连接成功

4、黑名单检测 (.htaccess文件绕过)

同样的道理

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists($UPLOAD_ADDR)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".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");
        $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)) {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
                $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
                $is_upload = true;
            }
        } else {
            $msg = '此文件不允许上传!';
        }
    } else {
        $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
    }
}

源码的黑名单文件基本上包括了所有了,直接上传.htaccess文件进行绕过

image-20210711230106372

然后上传图片马。和第三关一样

image-20210711230420962

每关还是上传不同的马好一点,防止错误判断

然后蚁剑连接

image-20210711230556901

5、重写特殊后缀绕过

仔细对比源码,发现第5关与第四关只有一行代码的区别

image-20210711231341034

清空文件后思路同样上传.htaccess文件

image-20210711231709958

已经做出了限制,那么思路并非如此,想到文件后缀

这道题将特殊字符例如空格,点,::$DATA以及.htaccess文件都给过滤了,均返回失败

试试重写特殊字符,成功绕过

点+空格+点,多加几个也可以,如下burp成功上传

image-20210711232300038

网页上放包看看返回地址是什么

image-20210711232441653

然后蚁剑连接

image-20210711232532476

查看文件发现并没有文件后的那个点

image-20210711232620012

因为Windows的特性,在创建文件的时候,末尾的点会被去掉。连接的时候加点或者不加点都可以连接成功。

image-20210711232807885

6、大小写绕过、空格绕过

查看代码是加入了

   $file_ext = strtolower($file_ext); //转换为小写

首先一想也是后缀问题,点空格直接绕过

image-20210711233022065

蚁剑连接

image-20210711233142400

阿哲

做到这里有眉头了,还是得分析分析源码,尽可能去思考其他所有的方法

果然第5关同比第5关少了大小写的限制,也可以成功上传

image-20210711233553528

image-20210711233657655

蚁剑连接

image-20210711233732690

这样一来就有了更多思路,每一题的想法都有了更多

7、特殊后缀绕过

添加了首位去空的限制

 $file_ext = trim($file_ext); //首尾去空

那好办,去空就去呗,我点+空格

image-20210711234754205

蚁剑连接

image-20210711234841857

image-20210711234825244

8、重写后缀绕过

点空格点绕过成功

image-20210711235104444

蚁剑连接

image-20210711235138079

image-20210711235154074

9、重写后缀绕过

点空格点再次成功

image-20210711235659655

image-20210711235753798

蚁剑连接

image-20210711235735892

10、重写后缀绕过

点空格点

image-20210714005634413

image-20210714005558162

11、双写后缀绕过

image-20210713181513267

上传后发现后缀名被去除

image-20210713181548377

想到双写后缀

image-20210713181854498

这样同样会被全部删除,再试试其他方法

image-20210713181742346

image-20210713181947333

此时后缀为.hp,仔细阅读源码后发现,连续的php会被删除,所有只要重写把其中一个php隔开,删除只后就只剩下php了、pphphp、这样都可以,pphpphphp这样都可以

image-20210713182633879

image-20210713182644250

如上可以成功

蚁剑连接成功

image-20210713182725076

12 白名单 get型%00截断

源代码里有这一行代码,判断为白名单限制,只允许三种文件

$ext_arr = array('jpg','png','gif');

上传图片发现报错

image-20210713184351843

解决方法:

1、在php.ini中设置date.timezone的值为PRC,设置好以后的为:date.timezone=PRC,同时取消这一行代码的注释,即去掉前面的分号就可以了。

image-20210713184259529

2、在页头使用date_default_timezone_set()设置我的默认时区为北京时间,即<?phpdate_default_timezone_set("PRC");?>就可以了。

做到这发现php版本问题无法继续做了

关键的代码在于这里的’save_path’是一个可控的变量,但是后面还拼接上一个后缀名,也需要绕过$img_path = GET[′savepath′]."/".rand(10,99).date("YmdHis")."."._GET['save_path']."/".rand(10, 99).date("YmdHis").".".GET[savepath]."/".rand(10,99).date("YmdHis").".".file_ext;

这个时候可以使用%00截断,但这东西有点过气了,因为需要两个条件

所以如果要绕过,我们可以这样去实现,另save_path等于../upload/11.php%00

PHP <= 5.3.4

13、白名单 POST型%00截断

同样版本问题就不继续做了

https://blog.csdn.net/Thunderclap_/article/details/108948611

14、图片马绕过

首先制作一个图片马,上传文件包含成功访问

制作命令:copy a.jpg /b + shell.php /a shell.jpg
/b 表示一个二进制文件
+ 表示将多个文件合并成一个文件
/a 表示一个ASCII文本文件

image-20210715161420821

同一目录下创建好文件

image-20210716141825220

生成图片马

image-20210715161640476

hex查看

image-20210715161742924

图片末尾会有一句话木马

image-20210715161759283

然后上传我们制作好的图片马

在这里插入图片描述

从题中可知使用文件包含漏洞访问

在这里插入图片描述

返回的地址如上

在这里插入图片描述

根据这里文件包含漏洞,构造地址

在这里插入图片描述

成功连接

当然也可以只是?file=upload/1920210716141959.jpg

15、getimagesize()图片马绕过

多了一个gettimagesize()函数

在这里插入图片描述

同上一关一样只是判断图片类型的方式不同

上传图片马即可

在这里插入图片描述

在这里插入图片描述

16、exif_imagetype()图片马绕过

在这里插入图片描述

exif_imagetype ( string $filename ) 用来读取一个图像的第一个字节并检查其签名。

方法一致,上传一个图片马即可绕过

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

17、二次渲染绕过

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])){
    // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
    $filename = $_FILES['upload_file']['name'];
    $filetype = $_FILES['upload_file']['type'];
    $tmpname = $_FILES['upload_file']['tmp_name'];
$target_path=UPLOAD_PATH.'/'.basename($filename);

// 获得上传文件的扩展名
$fileext= substr(strrchr($filename,"."),1);

//判断文件后缀与类型,合法才进行上传操作
if(($fileext == "jpg") && ($filetype=="image/jpeg")){
    if(move_uploaded_file($tmpname,$target_path)){
        //使用上传的图片生成新的图片
        $im = imagecreatefromjpeg($target_path);

        if($im == false){
            $msg = "该文件不是jpg格式的图片!";
            @unlink($target_path);
        }else{
            //给新图片指定文件名
            srand(time());
            $newfilename = strval(rand()).".jpg";
            //显示二次渲染后的图片(使用用户上传图片生成的新图片)
            $img_path = UPLOAD_PATH.'/'.$newfilename;
            imagejpeg($im,$img_path);
            @unlink($target_path);
            $is_upload = true;
        }
    } else {
        $msg = "上传出错!";
    }

}else if(($fileext == "png") && ($filetype=="image/png")){
    if(move_uploaded_file($tmpname,$target_path)){
        //使用上传的图片生成新的图片
        $im = imagecreatefrompng($target_path);

        if($im == false){
            $msg = "该文件不是png格式的图片!";
            @unlink($target_path);
        }else{
             //给新图片指定文件名
            srand(time());
            $newfilename = strval(rand()).".png";
            //显示二次渲染后的图片(使用用户上传图片生成的新图片)
            $img_path = UPLOAD_PATH.'/'.$newfilename;
            imagepng($im,$img_path);

            @unlink($target_path);
            $is_upload = true;               
        }
    } else {
        $msg = "上传出错!";
    }

}else if(($fileext == "gif") && ($filetype=="image/gif")){
    if(move_uploaded_file($tmpname,$target_path)){
        //使用上传的图片生成新的图片
        $im = imagecreatefromgif($target_path);
        if($im == false){
            $msg = "该文件不是gif格式的图片!";
            @unlink($target_path);
        }else{
            //给新图片指定文件名
            srand(time());
            $newfilename = strval(rand()).".gif";
            //显示二次渲染后的图片(使用用户上传图片生成的新图片)
            $img_path = UPLOAD_PATH.'/'.$newfilename;
            imagegif($im,$img_path);

            @unlink($target_path);
            $is_upload = true;
        }
    } else {
        $msg = "上传出错!";
    }
}else{
    $msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";
}
}

上传图片马后另存为新图片

对比源来的图片马之后发现原理的一句话木马已经失效了

修改之后再上传

在这里插入图片描述

在这里插入图片描述

emmmmm没做出来,可以看文章末大佬的博客

18、条件竞争绕过

19、条件竞争绕过

这关作者应该是想让我们,运用条件竞争+Apache解析漏洞来进行上传的,直接上传图片马也绕过了

在这里插入图片描述

在这里插入图片描述

20、%00绕过

在这里插入图片描述

%00截断需要php版本这里不再赘述

21、MIME、数组、%00绕过

也需要版本,更详细看参考博客,有详细的代码分析,我也会继续完善

https://blog.csdn.net/m0_46436640/article/details/107809772

至此此靶场告一段落了,慢慢完善知识吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值