upload 通关pass16-pass20
1.pass16 白名单 二次渲染
需要先上传一个正常图片,然后下载下来,跟原图片进行比对,用010 16进制编辑器,把php代码放到没有改变的位置,即一样的地方

访问:
 
2.pass17 白名单 条件竞争

 这题先是上传文件并保存该文件,然后在检查后缀,不是允许上传的文件就删除(unlink),可以利用条件竞争在文件删除前在新建一个文件
 burp抓包,随便设一个变量,使用intruder模块进行爆破
 
观察文件是否产生,使用python去访问
 1.php
<?php file_put_contents('2.php','<?php phpinfo()?>'); ?>
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
访问
 
3.pass-18 白名单 文件包含图片马

 这题看着很多代码,检查了后缀名所以后缀需要是允许的那几个
 myupload.php改一下文件上传的位置
 
burp抓包改后缀
 
访问
 
4.pass-19 黑名单 ./绕过

 通过代码审计,发现保存的文件名可控,这个地方没有检查上传时的文件后缀,即上传时文件后缀是什么也可以,检查的是保存的文件名的后缀,windows流一些特征都可以使用,没有过滤
burp抓包 加上/.,空格,::$data,点都可以绕过
 或者%00截断 upload-19.php%00.jpg %00解码upload-19.php .jpg
 需要小于5.3.4,且magic_quote_gpc为off
  访问
访问
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抓包
 
 访问
 
 总结:
 
 参考文章:
 pass-20数组绕过
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号