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

2017-12-12  本文已影响153人  ch3ckr

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

题目界面:

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

<?php
    $type = array('gif','jpg','png');
    mt_srand((time() % rand(1,100000)%rand(1000,9000)));
    echo mt_rand();
    if (isset($_POST['submit'])) {
        $check = getimagesize($_FILES['file']['tmp_name']);
        @$extension = end(explode('.',$_FILES['file']['name']));
        echo $extension;
        if(in_array($extension,$type)){
            echo 'File is an image - ' . $check['mime'];
            $filename = 'D:/phpstudy/PHPTutorial/WWW/upload/'.mt_rand().'_'.$_FILES['file']['name']; 
            move_uploaded_file($_FILES['file']['tmp_name'], $filename);
            echo "<br>\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进行爆破,得到种子后产生的第二个随机数就是文件名的一部分。

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

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

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

上一篇下一篇

猜你喜欢

热点阅读