冰冰走起!!!
URL地址:http://localhost/upload-labs/upload/upload-20.jpg
查看提示:
我们这里先上传一个php探针,并用BURP截取,查看一下报文的情况!!!!
小知识:代码审计
explode() 函数把字符串打散为数组。
explode(separator,string,limit)
separator |
必需。规定在哪里分割字符串。 |
string |
必需。要分割的字符串。 |
实例: $file = explode(‘.’, strtolower($file));
把文件名通过点号进行分割为数组。
例如:文件名是21. php.jpg ,根据上面的empty()函数,当save_name非空是为自身。
save_name[0]=21
save_name[1]=php
save_name[2]=jpg
end() 函数将数组内部指针指向最后一个元素,并返回该元素的值(如果成功),这里是取post参数数组中的最后一个文件名。
实例:$ext = end($file);
这里需要返回值为jpg,png,或者gif可以通过过滤!!!
reset() 函数将内部指针指向数组中的第一个元素,并输出。
实例: $file_name = reset($file) . ‘.’ . $file[count($file) – 1];
reset($file)返回save_name[0]=21
$file[count($file) – 1];返回save_name[2]=jpg
最后成功的上传了一个jpg图片!!!!
但是我们要上传的是php啊!!!!功亏一篑啊!!!
所以这里有个问题:我们既然可以控制save_name,所以我们这里不传递保存的文件名:而是直接传递数组元素:
save_name[0]=21.php/.
save_name[1] 不管
save_name[2]=jpg
我们这里传递数组的第一个和第三个元素:
$file_name = reset($file) . ‘.’ . $file[count($file) – 1];
重新组合后,生成的文件名是:
21.php/.jpg
在move_uploaded_file()会忽略掉文件末尾的/.及后续的文件
此外还有,根据源代码的情况:我可以分析出几个位置:首先会检查MIME类型,所有需要将Content-type修改为image/jpeg等图片类型。
接下来,我们进行实践:
http://localhost/upload-labs/upload/upload-20.php/
重点为啥upload-20.php/后面为啥没有点,因为后面后自动加点,实现截断
已成功上传文件!!!!
http://localhost/upload-labs/upload/upload-20.php/
来源:freebuf.com 2021-07-25 06:53:32 by: 知非知非知非
请登录后发表评论
注册