文件上传漏洞:从原理到实战,一文讲透
文件上传漏洞,本质上是指服务器允许用户上传任意类型的文件,攻击者借此植入恶意脚本或危险内容,进而在服务器端执行。这一机制看似简单,但其背后的原理和各种绕过技巧,值得深入剖析。本文将从多个常见的安全问题入手,带你全面了解文件上传漏洞。
文件上传后容易引发的安全问题,通常包括以下几种:
- 上传的是Web脚本语言文件,例如PHP、ASP,服务器端的Web容器直接解释执行,导致远程代码执行。
- 上传的是Flash策略文件
crossdomain.xml,攻击者借此控制Flash在该域名下的行为(其他类似通过策略文件控制的方式同理)。 - 上传的是病毒、木马文件,用来诱骗用户或管理员下载执行。
- 上传的是钓鱼图片,或者包含脚本的图片,在某些浏览器版本中会被当作脚本执行,用于钓鱼欺诈。
除了这些,还有一些不常见的利用方式,比如把上传文件当作入口,溢出服务器后台处理程序(如图片解析模块);或者上传一个普通文本文件,里面藏了PHP脚本,再通过“本地文件包含漏洞”来执行它,等等。
要完成这类攻击,需要满足几个条件:
- 上传的文件能被Web容器解释执行。也就是说,文件上传后的目录必须在Web容器覆盖的路径下。
- 用户能从Web上访问到这个文件。如果文件上传了但用户无法通过Web访问,或者Web容器根本不解释这个脚本,那就算不上漏洞。
- 用户上传的文件如果被安全检查、格式化、图片压缩等功能改变了内容,攻击也可能不成功。
一、从FCKEditor文件上传漏洞谈起
FCKEditor是一款非常流行的富文本编辑器,为了方便用户,它自带文件上传功能。然而,正是这个功能,曾经出现过不少安全漏洞。
FCKEditor针对ASP/PHP/JSP等环境都有对应版本。以PHP为例,其文件上传功能通常会配合解析漏洞一起使用。
(一) IIS 5.x-6.x 解析漏洞
使用IIS 5.x-6.x版本的服务器,多半是Windows Server 2003,网站比较老旧,开发语言通常为ASP。这个解析漏洞只能解析ASP文件,不能解析ASPX文件。
- 目录解析(6.0)
形式:www.xxx.com/xx.asp/xx.jpg
原理:服务器默认会把.asp目录下的文件都解析成ASP文件。 - 文件解析
形式:www.xxx.com/xx.asp;.jpg
原理:服务器默认不解析分号后面的内容,所以xx.asp;.jpg就被解析成了ASP文件。 - 解析文件类型
IIS 6.0默认的可执行文件除了ASP,还包含.asa、.cer、.cdx这三种。
(二) Apache 解析漏洞
Apache解析文件的规则是从右到左判断。如果后缀名不可识别,就继续往左判断。例如test.php.qwe.asd,其中.qwe和.asd是Apache不可识别的后缀,那么Apache就会把整个文件解析成PHP。
漏洞形式:www.xxxx.xxx.com/test.php.php123
还有一些配置问题也会导致漏洞:
- 如果在Apache的
conf里有这样一行配置:AddHandler php5-script .php,那么只要文件名包含.php,即使文件名是test2.php.jpg,也会以PHP方式执行。 - 如果配置了
AddType application/x-httpd-php .jpg,即使扩展名是.jpg,同样能以PHP执行。
修复方案:在Apache配置文件中禁止.php.这类文件执行;或者用伪静态重写类似.php.*的文件,打开httpd.conf找到LoadModule rewrite_module modules/mod_rewrite.so,去掉注释,重启Apache,再在网站根目录下建立.htaccess文件。
(三) Nginx 解析漏洞
Nginx默认以CGI方式支持PHP解析,通常做法是在配置文件中通过正则匹配设置SCRIPT_FILENAME。当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置为phpinfo.jpg/1.php,然后构造成SCRIPT_FILENAME传递给PHP CGI。那为什么PHP会接受这样的参数,并把phpinfo.jpg当作PHP文件解析呢?关键在于fix_pathinfo这个选项。如果开启了它,PHP就会认为SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,于是就把phpinfo.jpg当作PHP文件来解析。
漏洞形式:
www.xxxx.com/UploadFiles/image/1.jpg/1.phpwww.xxxx.com/UploadFiles/image/1.jpg%00.phpwww.xxxx.com/UploadFiles/image/1.jpg/%20\0.php
还有一种手法:上传一个名为test.jpg的文件,然后访问test.jpg/.php,在这个目录下就会生成一句话木马shell.php。
(四) IIS 7.5 解析漏洞
IIS 7.5的漏洞与Nginx类似,都是因为PHP配置中开启了cgi.fix_pathinfo,这并非Nginx或IIS 7.5本身的漏洞。
5. 配合操作系统文件命名规则
上传不符合Windows文件命名规则的文件名,比如:
test.asp.test.asp(空格)test.php:1.jpgtest.php::$DATA
这些会被Windows系统自动去掉不符合规则符号后面的内容。具体操作可以参考下图:

点击Create Folder新建文件夹。

用Burp Suite改包,将%2F改为a.asp。

点击Get Folders获得文件夹。

上传文件(比如一句话图片木马),然后能看到上传路径,访问1.asp/FI201610191827336199.jpg会被当作ASP执行,用菜刀连接即可getshell。

二、绕过文件上传检查功能
绕过上传检查,最常见的手段是通过文件名后缀检查。但有时候,攻击者手动修改上传过程中的POST包,在文件名后添加一个%00字节,就能截断某些函数对文件名的判断。因为在C、PHP等语言的常用字符串处理函数中,0x00被认为是终止符。受此影响的环境包括Web应用和一些服务器。比如应用原本只允许上传JPG图片,那么可以构造文件名为xxx.php[\0].JPG(其中[\0]是十六进制的0x00字符),.JPG绕过了应用的上传类型判断,但服务器因为0x00截断,最终却变成了xxx.php。
1. 客户端校验
一般是在网页上用JavaScript脚本校验上传文件的后缀名,有白名单也有黑名单。判断方式:在浏览器加载文件后,还没点击上传按钮就弹出对话框,内容比如“只允许上传.jpg/.jpeg/.png后缀名的文件”,而此时并没有发送数据包。

