mt_rand()/文件上传/phar协议/文件包含--C1ctf2017

我把题目简化了一下,去掉命令执行部分,主要剩下标题四个知识点。

题目界面:

mt_rand()/文件上传/phar协议/文件包含--C1ctf2017_第1张图片

题目代码:链接
关键代码:

\n";
        } else {
            echo "File is not an image";
        }
    }
    if(isset($_GET['p'])){
        if(@preg_match("/\.\.\//",$_GET['p'])){
            echo "too young too simple";
        }
        else{
           @include $_GET['p'].".php";
        }
    }
?>

第一个问题:mt_rand()可以使用php_mt_seed进行爆破,得到种子后产生的第二个随机数就是文件名的一部分。

mt_rand()/文件上传/phar协议/文件包含--C1ctf2017_第2张图片

第二个问题,上传部分这里仅仅校验mime类型与文件后缀,所以可以通过使用phar伪协议来解决,即将一个php文件打包成zip,然后修改成array里面种的一个后缀就可以上传成功了。

nac.php -> 压缩 -> nac.zip -> -> 改后缀 -> nac.png ->上传

第三个问题就是文件包含,源代码最后有一个文件包含就可以利用上传的文件了。

mt_rand()/文件上传/phar协议/文件包含--C1ctf2017_第3张图片

你可能感兴趣的:(mt_rand()/文件上传/phar协议/文件包含--C1ctf2017)