文件上传漏洞通常是指“上传web脚本可以被服务器解析”的问题,也就是常说的webshell的问题,要完成这个攻击须要知足如下几个条件:php
绕过文件上传检查功能:web
Apache文件解析问题:在Apache1.x、2.x中,对文件名的解析就存在如下特性。shell
Apache对于文件名的解析是从后往前解析的,直到碰见一个Apache认识的文件类型为止。好比浏览器
Phpshell.php.rar.rar.rar.rar
由于Apache不认识.rar这个文件类型,因此会一直遍历后缀到.php,而后认为这是一个PHP类型的文件。安全
IIS文件解析问题:IIS6在处理文件解析时,也出过一些漏洞。前面提到的0x00字符截断文件名,在IIS和Windows环境下出现过相似的漏洞,不过截断字符变成了分号“;”。服务器
当文件名为abc.asp;xx.jpg时,IIS 6会将此文件解析为abc.asp,文件名被截断了,从而致使脚本被执行。好比:函数
http://www.target.com/path/xyz.asp;abc.jpg
除此漏洞外,ISS 6还出过一个漏洞,由于处理文件夹拓展名出错,致使将/*.asp/目录下全部文件都做为ASP文件进行解析。好比:网站
http://www.target.com/path/xyz.asp;abc.jpg
设计安全的文件上传功能:spa
1.文件上传的目录设置为不可执行设计
只要web容器没法解析该目录下的文件,即攻击者上传了脚本文件,服务器自己也不会受到影响。在实际应用中,不少大型网站的上传应用,文件上传后会放到独立的存储上,作静态文件处理。
2.判断文件类型
在判断文件类型时,能够结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单的方式。此外,对于图片的处理,可使用压缩函数或者resize函数,在处理图片的同时破坏图片可能包含的HTML代码。
3.使用随机数改写文件名和文件路径
文件上传若是要执行代码,则须要用户可以访问到这个文件。若是使用随机数改写了文件名和路径,将极大地增长攻击的成本。
4.单独设置文件服务器的域名
因为浏览器同源问题策略的关系,一系列客户端攻击将失效。