1、背景介绍
在网站的运营过程中,不可避免地要对网站的某些页面或者内容进行更新,这时便需要使用到网站的文件上传的功能。如果不对被上传的文件进行限制或者限制被绕过,该功能便有可能会被利用于上传可执行文件、脚本到服务器上,进而进一步导致服务器沦陷。
2、漏洞成因
导致文件上传的漏洞的原因较多,主要包括以下几类:
-
服务器配置不当
-
开源编辑器上传漏洞
-
本地文件上传限制被绕过
-
过滤不严或被绕过
-
文件解析漏洞导致文件执行
-
文件路径截断
服务器配置不当
当服务器配置不当时,在不需要上传页面的情况下便可导致任意文件上传,参见HTTP请求方法(PUT)。
开源编辑器上传漏洞
很多开源的编辑器历史上都有不同的上传漏洞,包括但不只限于CKEditor,CKEditor的文件上传漏洞参见CKEditor。
本地文件上传限制被绕过
只在客户端浏览器上做了文件限制而没有在远程的服务器上做限制,只需要修改数据包就可以轻松绕过限制。
过滤不严或被绕过
有些网站上使用了黑名单过滤掉了一些关键的可执行文件脚本后缀等,但黑名单不全或者被绕过,导致可执行脚本文件被上传到服务器上,执行。
如在服务器后端过滤掉了后缀为.php的文件,但并没有过滤掉.php3等其他可执行文件脚本后缀,攻击者就可以上传带有其他的可执行文件脚本本后缀的恶意文件到服务器上。
常用的一些可执行的文件脚本的后缀
php php2 php3 php5 phtml asp aspx ascx ashx cer jsp jspx
在某些情况下由于管理员错误的服务器配置(将.html后缀的文件使用php进行解析等)会导致.html、.xml等静态页面后缀的文件也可被执行。
在上传文件保存磁盘为NTFS格式时可通过::$DATA绕过黑名单限制,参见NTFS中的ADS的一些问题[欢迎一起讨论,求思路求方法]。
有时服务器只对第一个被上传的文件进行了检查,这时通过同时上传多个文件并将恶意文件掺杂进其中也可绕过服务器的过滤。
文件解析漏洞导致文件执行
当服务器上存在文件解析漏洞时,合法的文件名便可导致带有恶意代码的文件被执行,参见解析漏洞。
文件路径截断
在上传的文件中使用一些特殊的符号,使得文件被上传到服务器中时路径被截断从而控制文件路径。
常用的进行文件路径截断的字符如下
\0 ? %00
在可以控制文件路径的情况下,使用超长的文件路径也有可能会导致文件路径截断。
3、漏洞的检测及利用
4、漏洞修复
服务器配置不当
重新配置好服务器。
服务器PUT方法配置不当可参见HTTP请求方法(PUT)
开源编辑器上传漏洞
若新版编辑器已修复漏洞,请更新编辑器版本。
本地文件上传限制被绕过
在服务器后端对上传的文件进行过滤。
过滤不严或被绕过
建议使用白名单的方法对文件进行过滤。
文件解析漏洞导致文件执行
文件解析漏洞的修复可参考文件上传。
文件路径截断
使用随机数改写文件名和文件路径,不要使用用户定义的文件名和文件路径。
除了以上的方法之外,还可将被上传的文件限制在某一路径下,并在文件上传目录禁止脚本解析。