upload-labs 21关解析

目录

一、代码审计

二、实践

三、总结


一、代码审计

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

对源代码进行分析

$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];

这是个三元运算符,判断 'save_name' 是否为空 

(A ? B : C  ,如果A成立,则运行B,否则运行C)

如果用户提交的'save_name'为空,则使用上传文件的原始文件名,若不为空则使用该参数值作为文件名

 if (!is_array($file)) {
            $file = explode('.', strtolower($file));
        }

判断 $file 是不是数组,如果不是数组,则使用 . 进行切分变为数组

比如 cooper.php.jpg,切分为 cooper php jpg 分别对应数组三个元素

 $ext = end($file);

从数组中获取最后一个元素作为扩展名

经过这两条分析,想想为什么要判断 'save_name' 参数是否为数组呢?

难道POST提交的不都是字符串吗?

那么就进行测试

发现请求参数可以直接以数组的方式提交

那么我们能否去构造一个POST请求的save_name参数,将文件后缀名改为jpg,但文件本身还是cooper.php

问题保留一下,接着分析

$file_name = reset($file) . '.' . $file[count($file) - 1];

reset函数为调用第一个元素

拼接文件名:数组第一个元素 + . + 数组最后一个元素

比如文件名为cooper.php,则 $file_name = cooper + . + php

那么如果直接上传的不是字符串,而是数组会怎么样?

比如save_name[0] = cooper.php , save_name[2] = jpg

按照拼接方法那我们构造的文件最后的方式为:

$file_name = cooper.php . $file[1]   ==> cooper.php.空

理论可行,实践开始!

二、实践

首先上传一个带有木马的php文件,使用burp抓包

.

将其修改为以下格式

提示上传成功,那么就来测试一下

试验成功!

三、总结

复盘一下:先进行代码审计,然后看到分割数组,思考为什么要进行分割,难道POST可以上传数组吗?然后进行实验,实验验证确实可以上传数组形式。接着代码审计,发现文件拼接时具有漏洞,那么构造payload进行尝试,最后成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值