01ctfer 文件上传

01ctfer 文件上传

启动靶场
01ctfer 文件上传_第1张图片
访问该地址
01ctfer 文件上传_第2张图片

代码审计


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

if(!$_FILES){

        echo '




    
    
    
    文件上传章节练习题
    
    


    
'
; show_source(__FILE__); }else{ $file = $_FILES['file']; if(!$file){ exit("请勿上传空文件"); } $name = $file['name']; $dir = 'upload/'; $ext = strtolower(substr(strrchr($name, '.'), 1));//转换后缀名大小写并获取 $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); } if(in_array($ext, array('zip', 'jpg', 'gif', 'png'))){ //设置白名单 if($ext == 'zip'){ $archive = new PclZip($file['tmp_name']); //进行解压pclzip存在目录穿越漏洞 foreach($archive->listContent() as $value){ $filename = $value["filename"]; 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文件!'); } }

经过代码审计该代码对文件上传的文件后缀名做了白名单过滤
发现该代码所用的函数pclzip存在目录穿越漏洞
该漏洞触发条件是当文件名的开头包含…/…/时那么就会将文件解压到上上级
利用该漏洞进行文件上传

利用pclzip函数的目录穿越漏洞进行文件上传

思路:将php文件双写后缀名,压缩成zip格式使用010editor 对文件名进行修改为…/…/然后再进行上传文件
创建一句话木马文件并进行压缩
01ctfer 文件上传_第3张图片
zip xl.zip xxxxxxxl.php.xl
在这里插入图片描述

用工具进行修改
01ctfer 文件上传_第4张图片
对文件进行上传
01ctfer 文件上传_第5张图片
上传成功
01ctfer 文件上传_第6张图片
访问文件获得flag
01ctfer 文件上传_第7张图片

你可能感兴趣的:(靶场,0_1ctf,web安全)