N1Book-第二章Web进阶-Web文件上传漏洞

N1Book-第二章Web进阶-Web文件上传漏洞

以下内容转自 https://www.icode9.com/content-4-874265.html

N1Book-第二章Web进阶-Web文件上传漏洞_第1张图片


header("Content-Type:text/html; charset=utf-8");
// 每5分钟会清除一次目录下上传的文件

//会包含文件pclzip.lib.php,感觉这个php里面是有一些针对zip包进行解压等的操作的
require_once('pclzip.lib.php');

//要是没上传文件,就输出上传页面
if(!$_FILES){
echo '省略的HTML'
    show_source(__FILE__);
}else{
    $file = $_FILES['file'];

//限制上传的文件名不为空
    if(!$file){
        exit("请勿上传空文件");
    }
    $name = $file['name'];

    $dir = 'upload/';
//strrchr($name, '.') 
//strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
//比如上传的文件名为$name=1.php.txt,这里strrchr($name, '.') 执行结果为.txt
//substr(strrchr($name, '.'), 1)
//substr字符串截取,从下标为1开始截取,那就是把点略过,截取后为txt
//通过strtolower函数将所有字符转换为小写,赋值给ext变量
    $ext = strtolower(substr(strrchr($name, '.'), 1));
//如果我们上传的文件名为1.txt,那么path变量就为upload/1.txt
    $path = $dir.$name;

//检查是否为目录
    function check_dir($dir){
        $handle = opendir($dir);
        while(($f = readdir($handle)) !== false){
            if(!in_array($f, array('.', '..'))){
                if(is_dir($dir.$f)){
                    check_dir($dir.$f.'/');
                 }else{
                    $ext = strtolower(substr(strrchr($f, '.'), 1));
                    if(!in_array($ext, array('jpg', 'gif', 'png'))){
                        unlink($dir.$f);
                    }
                }
            
            }
        }
    }
    
//创建目录    
    if(!is_dir($dir)){
        mkdir($dir);
    }

//将目录名拼接一个随机数,读到这里,基本上就知道需要路径穿越了,因为我们不知道随机数值,所以就算绕过上传,解析也是一大关
    $temp_dir = $dir.md5(time(). rand(1000,9999));
    if(!is_dir($temp_dir)){
        mkdir($temp_dir);
    }

//首先进行后缀的校验,把刚刚拿到的,最后一个.后面的字符串和这里的zip、jpg、gif、png进行对比校验
    if(in_array($ext, array('zip', 'jpg', 'gif', 'png'))){
        if($ext == 'zip'){
//使用PclZip进行解压缩        
            $archive = new PclZip($file['tmp_name']);
//遍历解压缩后的每个目录            
            foreach($archive->listContent() as $value){
                $filename = $value["filename"];
//一段较为简单的正则,就是匹配每个文件结尾的位置,是否是.php                
                if(preg_match('/\.php$/', $filename)){
                     exit("压缩包内不允许含有php文件!");
                 }
            }
            if ($archive->extract(PCLZIP_OPT_PATH, $temp_dir, PCLZIP_OPT_REPLACE_NEWER) == 0) {
                check_dir($dir);
                   exit("解压失败");
            }

            check_dir($dir);
            exit('上传成功!');
        }else{
            move_uploaded_file($file['tmp_name'], $temp_dir.'/'.$file['name']);
            check_dir($dir);
            exit('上传成功!');
        }
    }else{
        exit('仅允许上传zip、jpg、gif、png文件!');
    }
}

其实看了一下代码,大致是了解了,正如书上所说,需要将php文件达成zip包,然后,绕过路经检测,通过路径穿越将文件放到指定目录,然后访问

由于我们上传的路径目录是upload/随机值/上传的文件, 所以我们要穿越两层,直到根目录下,一层随机目录,一层upload

所以需要文件名为/…/…/file.php,由于需要构造解析,利用apache的解析漏洞,如果从右开始,直到哪个能识别就解析哪个,构造最终文件名为/…/…/zzz.php.zzz,这个文件名长度为18位

windows操作系统下,右键创建文件,文件名随便写一个18位的(跟刚刚的文件名位数一样),这里是把后缀涵盖的,例如

123456789012345678

然后用WinRar,右键添加到zip
接下来就开始用010 Editor进行zip文件的编辑
N1Book-第二章Web进阶-Web文件上传漏洞_第2张图片

修改为/…/…/zzz.php.zzz,ctrl+s保存
N1Book-第二章Web进阶-Web文件上传漏洞_第3张图片
上传这个zip, 然后访问
在这里插入图片描述

你可能感兴趣的:(CTFHUB,经验分享,web安全,php)