文件上传漏洞小结-爱代码爱编程
提示:结合《upload-labs通关记录》阅读效果更佳!
简介
文件上传,就是客户端将文件上传到服务端,然后服务端将其保存,比如我们给账户上传个头像就属于文件上传,其标志就是有一个上传入口。
文件上传功能如果做得不完善的话是很危险的,攻击者可以利用其中的漏洞上传攻击文件对网站进行攻击。
常见漏洞
1、对上传的文件不做检查.。.....这种吧就不多说了,我想不会有哪个开发者这么大意。
2、客户端验证。也就是验证部分跟上传表单在同一界面,这种只需要"魔改"客户端页面即可,如禁JS、改JS或表单的代码。
3、服务端验证。
(1)MIME类型验证。代理抓包,改Content-Type即可。
(2)扩展名黑名单验证。这种验证机制的漏洞其实源于服务器、操作系统或php本身,同时还得看黑名单做得是否全面以及服务端php版本是否配合等多方面因素。
Windows系统:
1、对大小写不敏感,所以可通过改扩展名如.phP绕过。
2、自动去除扩展名末尾的空格、点、::$DATA,所以依旧可通过改扩展名绕过,有时还需要打组合拳,如改成".php. ."。
Apache解析漏洞:
1、更改配置文件可以使其将奇葩后缀如.phtml、.php3作为.php解析。
附:亲测有效,在AddType加入.jpg并上传简易版图片马,也会将其当.php解析。
2、上传.htaccess文件覆盖配置文件。
针对php本身:
1、00截断。
2、上传.user.ini文件覆盖php.ini。
3、move_upload_file函数会忽略扩展名末尾的"/.",所以可以魔改扩展名绕过。
(3)文件内容验证。如使用getimagesize函数,可通过标准图片马绕过(不过得结合文件包含才能解析)。
如果不进行内容验证,单纯验证扩展名,可通过上传简易版图片马绕过,不过依旧要结合文件包含才能解析。
3、开发时留下的漏洞。如存在条件竞争、使用了二次渲染、将危险扩展名(如.php)替换为空(可通过双写绕过)、upload-labs之Pass-21。
可行的防御方法
1、对上传文件做严格的检查,最好是打组合拳,同时写完善黑名单。
虽然下面这种存在漏洞,但可以借鉴一下这种组合拳打法:
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空
2、不要暴露上传路径,尽量将上传文件夹藏好。
3、对上传文件进行重命名。
4、开发时做好潜在漏洞的排查,运维人员定时检查系统日志。