upload 通关pass16-pass20

1.pass16 白名单 二次渲染

需要先上传一个正常图片,然后下载下来,跟原图片进行比对,用010 16进制编辑器,把php代码放到没有改变的位置,即一样的地方

upload 通关pass16-pass20_第1张图片

访问:
upload 通关pass16-pass20_第2张图片

2.pass17 白名单 条件竞争

upload 通关pass16-pass20_第3张图片
这题先是上传文件并保存该文件,然后在检查后缀,不是允许上传的文件就删除(unlink),可以利用条件竞争在文件删除前在新建一个文件
burp抓包,随便设一个变量,使用intruder模块进行爆破
upload 通关pass16-pass20_第4张图片

观察文件是否产生,使用python去访问
1.php

'); ?>

python

url='http://192.168.85.120/upload-labs/upload/1.php'
    while True:
        html=requests.get(url=url)
        if html.status_code==200:
        	print('ok')
            break

访问
upload 通关pass16-pass20_第5张图片

3.pass-18 白名单 文件包含图片马

upload 通关pass16-pass20_第6张图片
这题看着很多代码,检查了后缀名所以后缀需要是允许的那几个
myupload.php改一下文件上传的位置
upload 通关pass16-pass20_第7张图片

burp抓包改后缀
upload 通关pass16-pass20_第8张图片

访问
upload 通关pass16-pass20_第9张图片

4.pass-19 黑名单 ./绕过

upload 通关pass16-pass20_第10张图片
通过代码审计,发现保存的文件名可控,这个地方没有检查上传时的文件后缀,即上传时文件后缀是什么也可以,检查的是保存的文件名的后缀,windows流一些特征都可以使用,没有过滤

burp抓包 加上/.,空格,::$data,点都可以绕过
或者%00截断 upload-19.php%00.jpg %00解码upload-19.php .jpg
需要小于5.3.4,且magic_quote_gpc为off
upload 通关pass16-pass20_第11张图片访问upload 通关pass16-pass20_第12张图片

5.pass-20 白名单 数组绕过

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {

        $is_upload = false;
        $msg = null;
        if(!empty($_FILES['upload_file'])){
            //mime check
            $allow_type = array('image/jpeg','image/png','image/gif');
            if(!in_array($_FILES['upload_file']['type'],$allow_type)){
                $msg = "禁止上传该类型文件!";
            }else{
                //check filename
                $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 = "请选择要上传的文件!";
        }
        
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

进行代码审计,刚开始进行了检查mime类型,需要修改为允许的那三种类型
之后判断文件名是不是没有,没有就从文件原先的名字获取,有从post方式获取save_name的值,然后判断文件是不是数组,不是数组就拆分成数组,如果是数组的话,获取数组的最后一个元素,判断是不是那三种图片类型,不是就继续进行移动文件,在移动文件之前需要获取文件名,reset函数把内部指针指向数组中的第一个元素,加上一个.,获取file数组的所有元素数量-1的元素
通过代码可以看出可以使用传入数组
下方传入的数组为一个,数组元素为2个。索引分别为0和2,这样的话文件命令时会使最后一个为空,因为 f i l e [ 1 ] 为空 , 传入索引为 0 元素的值还可以用 w i n d o w s 一些环境特性的值,点空格 : : file[1]为空,传入索引为0元素的值还可以用windows一些环境特性的值,点 空格 :: file[1]为空,传入索引为0元素的值还可以用windows一些环境特性的值,点空格::data,或/.(windows和linux都可以使用)
burp抓包
upload 通关pass16-pass20_第13张图片
访问
upload 通关pass16-pass20_第14张图片
总结:
upload 通关pass16-pass20_第15张图片
参考文章:
pass-20数组绕过

你可能感兴趣的:(靶机及靶场通关,php,前端,网络安全)