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 ->上传
第三个问题就是文件包含,源代码最后有一个文件包含就可以利用上传的文件了。