upload-labs靶场-第二十一关 综合绕过 上传校验 – 作者:知非知非知非

冰冰走起!!!

1627088510_60fb667e42449aa2de65f.png!small

URL地址:http://localhost/upload-labs/upload/upload-20.jpg

查看提示:

1627088515_60fb668314f2002ff02df.png!small

我们这里先上传一个php探针,并用BURP截取,查看一下报文的情况!!!!

1627088530_60fb66925be97321aa24b.png!small

小知识:代码审计

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/

1627088544_60fb66a00b0d9c62b271d.png!small

1627088558_60fb66ae987d1404fa37c.png!small

重点为啥upload-20.php/后面为啥没有点,因为后面后自动加点,实现截断

已成功上传文件!!!!

1627088564_60fb66b49a8aba6945bf4.png!small

1627088570_60fb66ba1cb15037bea17.png!small

http://localhost/upload-labs/upload/upload-20.php/

1627088576_60fb66c03f1799d206da9.png!small

来源:freebuf.com 2021-07-25 06:53:32 by: 知非知非知非

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论