CTFHub 文件上传-00截断
00截断有限制,php版本得低于5.3,并且GPC得关闭,一般在url上。
两种,%00和0x00,后台读取是遇到%00就会停止。
举个例子,url中输入的是upload/post.php%00.jpg,那么后台读取到是upload/post.php,就实现了绕后目的。
进入题目,上传一个名为post.php%00.jpg的文件,弹出一个上传成功的弹窗,上传成功了,url地址栏出现了?road=/var/www/htm/ 没有返回文件的路径地址,多半是有临时文件名的存在,这就需要00截断,00截断的主要目的就是为了得到上传文件的路径地址,从而可以用蚁剑连接。
burp抓包得到了源码
if (!empty($_POST['submit'])) {
$name = basename($_FILES['file']['name']);
$info = pathinfo($name);
$ext = $info['extension'];
$whitelist = array("jpg", "png", "gif");
if (in_array($ext, $whitelist)) {
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
echo "<script>alert('上传成功')</script>";
} else {
echo "<script>alert('上传失败')</script>";
}
} else {
echo "文件类型不匹配";·
}
}
move_uploaded_file($_FILES['file']['tmp_name'],$des)
这个函数就是把上传文件放到$des
的路径上并且改了文件名,而$des
中的随机数,当前时间等无法确定,那么,在$_GET[‘road’]后面进行00截断
payload:POST /?road=/var/www/html/upload/post.php%00 HTTP/1.1
重新上传,这样,上传文件就被保存到了upload/post.php下,直接访问
phpinfo()函数成功,在用蚁剑连接
这就是截断路径后的上传文件拿到flag
以上原理解释不是很明确,请见谅