文件上传漏洞_00截断
key:PHP的%00截断
①原题界面如下👇
直接上传.php文件显然不行,再尝试上传图片马还是不行
②burpsuite抓包,放到repeater中👇
go一下在回应报文里找到源码👇
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 "文件类型不匹配";
}
我们上传的图片马格式是在白名单里的gif,显然格式没有错误
注意这一行代码👇
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
rand()函数显然是生成了随机数,对文件上传的路径进行了拼接
所以我们在成功上传后还是找不到文件路径,依旧无法连接
③思路就是用一个截断字符把随机数给截断掉,那就是00截断
简单来说就是php版本<5.3.4的网页,在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束
④明白了原理,那就开始操作,尝试修改请求头里的文件上传路径👇
这样一来,文件上传路径就可以被我们人为地确定了
⑤蚁剑连接上URL+文件上传路径(也就是/upload/1.php)
在html目录下找到flag文件