文件上传漏洞小结

提示:结合《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、开发时做好潜在漏洞的排查,运维人员定时检查系统日志。

你可能感兴趣的:(安全学习,web安全)