漏洞描述
上传文件对应用程序来说是一个很大的风险,许多攻击的第一步是把一些恶意代码上传到要攻击的系统中。然后,攻击者只需要找到一种方法来让代码被执行即可完成攻击。该漏洞通常是由于代码中对文件上传功能所上传的文件过滤不严而造成的,如果文件上传功能代码没有严格限制和验证用户上传的文件后缀、类型等,攻击者可通过文件上传点上传任意文件,包括网站后门文件(webshell)控制整个网站。
漏洞影响
任意文件上传漏洞可能造成很多严重的影响,例如主机系统失陷、文件系统或数据库过载、被作为攻击后端系统的跳板机等。
修复建议
应遵循以下原则来保证文件上传功能的安全:
在服务端设置白名单限制文件后缀名
通过文件头验证文件类型,而不是 Content-Type
重命名上传的文件
设置文件名长度限制,尽可能限制允许的字符
设置上传文件的大小限制
只允许授权用户上传文件
将上传的文件存储在不同的服务器上,如果不可能,将它们存储在webroot以外的地方
在公共访问文件的情况下,使用一个处理程序,该处理程序被映射到应用程序内部的文件名(someid -> file.ext)
通过杀毒软件或沙箱(如果有)运行该文件,以验证它不包含恶意数据
通过 Token 或 Referer 验证文件上传功能,防止CSRF攻击