目录
1. 文件上传漏洞概述
1.1 FCKEditor文件上传漏洞
1.2 绕过文件上传检查功能
2. 功能还是漏洞
2.1 Apache文件解析
2.2 IIS文件解析
2.3 PHP CGI路径解析
2.4 利用上传文件钓鱼
3. 设计安全的文件上传功能
1. 文件上传漏洞概述
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务端命令的能力。
应用:例如上传一张图片、分享一段视频、论坛发帖时附带附件、发邮件时附带附件……
文件上传后导致的安全问题一般有:
- 上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行
- 上传文件时Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为
- 上传文件时病毒、木马文件,黑客诱骗用户下载执行
- 上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈
- 将上传文件作为一个入口,溢出服务器的后台处理程序,如图片解析模块
- 上传一个合法的文本文件,其内容包含PHP脚本,再通过本地文件包含漏洞执行该脚本
- ……
要实现webshell,要满足以下几个条件:
- 上传的文件能被Web容器解释执行,文件上传后的目录是Web容器所覆盖到的路径
- 用户能从Web上访问这个文件
- 文件不会被安全检查、格式化、图片压缩等功能改变内容而导致攻击不成功
1.1 FCKEditor文件上传漏洞
FCKEditor是一款非常流行的富文本编辑器,其上传文件的功能能将用户上传的文件保存在/UserFiles/all/目录下
在有漏洞的版本中,通过黑名单来确认文件的安全性
以上述黑名单为例,当我们上传后缀为php2、php4、inc、pwml、asa、cer等文件时就能绕过
1.2 绕过文件上传检查功能
- %00截断
在 C、PHP等语言的常用字符串处理函数中,0x00被认为是终止符,因此在文件名后添加一个%00字节,可以截断某些函数对文件名的判断
例如只允许上传JPG图片,可以构造文件名xxx.php[\0].JPG,其中[\0]为十六进制的0x00字符,.JPG绕过了应用的上传文件类型判断,但对于服务器端来说,此文件因为0x00字符截断,会变成xxx.php
- 伪造文件头
有的应用会通过文件头验证文件类型
常见的攻击技巧是伪造一个合法的文件头,将真实的PHP等脚本代码附在文件头之后
但仍需要通过PHP来解释此图片文件才行,若上传的文件后缀是JPG,则Web Server可能会将此文件当作静态文件解析,不会调用PHP解释器,也就无法进行攻击
2. 功能还是漏洞
2.1 Apache文件解析
Apache对于文件名的解析是从后往前解析的,直至遇见一个Apache认识的文件类型为止
例如:
phpshell.php.rar.rar.rar.rar.rar
Apache不认识.rar文件类型,会一直遍历到.php,认为这是一个PHP类型的文件
黑客就可以利用该特性绕过对后缀名的限制,实现php脚本的执行
(在Apache的mime.types文件中定义了它所认识的文件)
2.2 IIS文件解析
- 分号“;”是截断字符
当文件名为abc.asp;xx.jpg时,IIS 6 会将此文件解析为abc.asp,从而导致脚本被执行
- 曾经出现过因处理文件夹扩展名出错,导致将/*.asp/目录下的所有文件都作为ASP文件进行解析
- PUT方法允许用户上传文件到指定目录下,结合MOVE方法可以将原本只允许上传文本文件改写为脚本文件,从而执行webshell
2.3 PHP CGI路径解析
Nginx作为代理把请求转发给fastcgi Server,PHP在后端处理。(使用Nginx作为Web Server时,一般使用fastcgi的方式调用脚本解释器。)
当访问
http://www.xxx.com/path/test.jpg/notexist.php
时,会将test.jpg当作PHP解析。notexist.php是不存在的文件。
如果在任何配置为 fastcgi的PHP应用里上传文件,其内容是PHP文件,则将导致代码执行。
原因:
PHP的配置文件中 cgi.fix_pathinfo=1默认开启
在上面的例子中,PATH_INFO=notexist.php,因为notexist.php不存在,会往前递归查询路径确认文件的合法性。此时SCRIPT_FILENAME检查文件是否存在,其值为/path/test.jpg,而此时PATH_INFO还是notexist.php,在最终执行时,test.jpg会被当作PHP解析。
2.4 利用上传文件钓鱼
利用文件上传功能,钓鱼者可以先将包含了HTML的文件(例如一张图片)上传到目标网站,然后通过传播这个文件的URL进行钓鱼,该URL中不会出现钓鱼地址。
png是伪造的文件头绕过上传时的文件类型检查,后面的脚本控制浏览器跳向指定的钓鱼网站,骗子在传播钓鱼网站时,只需要传播合法图片的URL
3. 设计安全的文件上传功能
- 文件上传的目录设置为不可执行
- 判断文件类型时可以结合MIME Type、后缀检查等方式,使用白名单
- 对于图片的处理使用压缩函数或resize函数,在处理图片的同时破坏其中可能包含的HTML代码
- 使用随机数改写文件名和文件路径
- 单独设置文件服务器的域名