《从0到1:CTFer成长之路》书籍配套题目-[第二章 web进阶]文件上传

[第二章 web进阶]文件上传

  • 开始行动
    • 绕过第1个限制
    • 绕过第2个限制

介绍:记录一下笔记,方便以后迅速回忆使用。

《从0到1:CTFer成长之路》书籍配套题目,来源网站:《从0到1:CTFer成长之路》

  • 先看一下题目源码:

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']); 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文件!'); } }
  • 看一下上传限制:
1.仅允许上传zip、jpg、gif、png文件!
2.如果上传压缩包,压缩包内不允许含有php文件
  • 官方wp+自己的梳理和理解

开始行动

绕过第1个限制

如果上传压缩包,压缩包内不允许含有php文件
白名单仅允许上传zip、jpg、gif、png文件,不允许上传php文件

首先根据404页面发现使用的是apache,由于apache存在的多后缀文件解析漏洞,这里上传一个x.php.xxx(这里任何不可识别的后缀都行),即可绕过该正则限制

《从0到1:CTFer成长之路》书籍配套题目-[第二章 web进阶]文件上传_第1张图片

绕过第2个限制

  • check_dir
if ($archive->extract(PCLZIP_OPT_PATH, $temp_dir, PCLZIP_OPT_REPLACE_NEWER) == 0) {
     
                check_dir($dir);
                   exit("解压失败");
            }

在压缩包解压失败后,会先删除目录下的非法文件后再退出,所以构造特殊压缩包(解压到一伴退出)方法在此处不可用。从代码中可知,check_dir方法只会递归检测upload目录下的所有文件,根据书中内容可知pclzip存在目录穿越问题。如果将解压出的文件穿越到非upload目录,check__dir方法就无法删除该文件。zip压缩包被解压到/upload/随机md5/目录下,所以需要穿越两个目录。

  • 首先生成一个正常的压缩包,压缩包内含有xxxxxxx.pxp.xxx文件,然后010 editor打开该压缩包。
  • 注意一个文件要修改两处
    《从0到1:CTFer成长之路》书籍配套题目-[第二章 web进阶]文件上传_第2张图片
    -…/…/x.php.xxx
  • 然后上传再访问即可成功拿到flag
上传成功!

《从0到1:CTFer成长之路》书籍配套题目-[第二章 web进阶]文件上传_第3张图片

你可能感兴趣的:(《从0到1:CTFer成长之路》书籍配套题目-[第二章 web进阶]文件上传)