在动态网站或web应用系统中,如果动态脚本没有对用户上传的文件类型进行检查和验证,会让非法用户提交危险内容或恶意代码到服务器,进而危害服务器数据和信息的安全。这种软件漏洞就叫做文件上传漏洞。
(1)可能造成非授权用户访问系统
(2)可能造成重要信息泄露
(3)可执行破坏性操作,甚至控制整个系统,毁坏数据
(4)可以为其他攻击打下基础
(1)攻击者利用搜索引擎或专用工具,搜索具备文件上传漏洞的动态网站或web应用系统。
(2)注册普通用户,获得文件上传权限和上传入口。
(3)利用漏洞向服务器上传恶意文件或内容。
(4)通过浏览器访问上传的恶意文件,使恶意文件被web解析器执行,并根据恶意文件提供的功能,实施下一步攻击。
(1)被攻击的动态网站或web应用系统具备文件上传功能,并开放给普通用户使用。
(2)软件代码中没有对普通用户上传的文件进行合法性判定,使非法文件得以上传。
(3)上传后的非法文件被服务器当做合法文件,正常解析执行。
文件从客户端上传到服务器是,根据HTTP协议,浏览器会强制在Header中增加MIMETYPE,用来识别文件类型。
服务器动态脚本可以通过判定文件的MIMETYPE字段内容,检查上传的文件是否合法。
上图是对上传文件类型的检查。
防护原理:文件从客户端上传到服务器后,服务器动态脚本可以获取文件名称。通过检查文件后缀是否满足条件,可以判定用户上传的文件是否合法。如下图:
防护原理:导致文件上传漏洞的根本原因在于服务器把用户上传的本应是数据的内容当做代码执行的。
防护策略:一般来说,用户上传的内容都会被存储到特定的一个文件夹下,如upload。要防止数据被当做代码执行,我们可以限制web server对于特定文件夹的行为。
防护方法:
以Apache为例:在默认情况下,所有.php文件被当做代码来执行;对于html,css,js文件,则会直接交给客户端浏览器执行;对于一些资源文件,如txt、doc、rar等,会以文件下载的方式传送到客户端。
所以根据以上特性,我们可以设置服务器程序的接口,让用户上传的文件仅当做资源和数据,而不能当做代码来执行。