一、文件上传漏洞概述
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。
在大多数情况下,文件上传漏洞一般都是指 “上传WEB脚本能够被服务器解析”的问题,也就是通常所说的webshell的问题。要完成这个攻击,要满足如下几个条件:
(1)上传的文件能够被web容器解释执行。所以文件上传后所在的目录要是WEB容器所覆盖到的路径。
(2)用户能够从web上访问这个文件。如果文件上传了,但用户无法通过web访问,或者无法使得web容器解释这个脚本,那么也不能称之为漏洞。
(3)用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。
二、WebShell上传利用
1、直接上传webshell
探测到上传点后,假如服务器端对用户提交参数或者文件没有进行过滤或者过滤不当,则能够直接上传webshell。
2、绕过客户端检测上传webshell
客户端检测即利用响应页面js脚本检测用户输入的一种方法,该方法在客户端进行,其明显特征是在用户上传文件到服务器之前进行检测,假如不符合要求,会提示相应错误。这里通常用burpsuite代理工具对扩展名进行修改。
3、绕过服务器文件扩展名检测上传webshell
服务器端文件扩展名检测是利用服务器端应用程序检测用户上传文件的后缀名,从而做出允许或者阻止的一种方法,该方法包含黑名单和白名单两种形式,具体如下:
- 黑名单检测:一般是建立一个专门的blacklist文件,里面枚举常见的危险文件后缀。
- 白名单检测:一般是定义一个允许或者阻止用户上传文件类型的后缀的文件,里面枚举相应的文件后缀。
绕过黑名单检测方法:
(1)文件名大小写绕过:诸如AsP、Aspx之类的后缀绕过黑名单检测。 (2)黑名单列表绕过:用黑名单里没有的后缀文件进行攻击,iis默认执行.asp、.asa、.cer,有时候黑名单过滤不全,没有过滤掉像后缀为asa、cer之类的文件,但这些文件可以像asp文件一样执行,此时可以使用这些后缀绕过黑名单。(3)特殊文件名绕过:比如发送的HTTP包里把文件名改成test.asp. 或test.asp_(下划线为空格),这两种命名方式在windows系统里是不被允许的,所以需要在代理工具burpsuite进行修改,然后绕过验证后,会被windows系统自动去掉后面的点和空格,但注意Unix/Linux系统没有此特性。
(4)0x00截断:在许多语言的常用字符串处理函数中,0x00被认为是终止符,比如应用只允许上传jpg图片,那么可以构造文件名为2.asp%00.jpg,.jpg绕过了应用的上传文件类型判断,但对于服务器来说,此文件因为%00字符截断的关系,最终会以2.asp存入路径里。绕过白名单检测方法
(1)0x00截断:基于白名单检查主要使用0x00截断绕过,同黑名单0x00截断绕过。但对于服务器来说,由于后台某些函数作用(诸如CreateTextFile()),此文件会被%00字符截断,最终会以2.asp存入路径里。4、绕过服务器MIME类型检测上传webshell
有时候仅仅对文件名后缀进行判断并不能有效阻止恶意文件的上传(比如某服务器只允许上传jpg文件格式,不允许上传后缀为php等文件,但是把后缀为php改为后缀为jpg上传到服务器,某些情况下也能执行上传文件),因此对文件格式进行检测十分必要,也就是服务器端MIME类型检测。通过检测http包的content-type字段的值来判断上传文件是否合法。
5、绕过文件内容检测上传webshell
文件内容检测即通过检测特定文件某些特殊标志位来判断是否是允许上传的一种方法,以后缀为.jpg图片文件为例,该文件头有一组特殊二进制数标识 FF D8 FF E0 00 10 4A 46 49 46(这些二进制数也叫文件幻数),那么就可以通过判断上传文件的文件头来验证文件的类型。 其实检测文件幻数只是检测的一项内容,还可以对文件相关信息、文件渲染加载后检测,面对这些检测,可以把一句话木马注入图片文件最后面,这样既实现了代码注入也不会破坏图片结构,具体步骤包括:代码注入图片、引用创建的文件、使用客户端连接一句话木马。
6、绕过服务器端目录路径检测上传webshell
服务器端目录路径检测即对用户提交目录路径参数进行检测的一种方法,有时候检测不够严谨而导致可以用%00截断进行攻击,该漏洞的本质同黑名单检测%00截断本质一样,但该漏洞要求服务器端应用程序具有处理用户提交的目录路径参数函数,不具有通用性。
7、利用服务器漏洞上传webshell
Web服务器解析漏洞产生是由于web server本身特性功能设计存在缺陷造成的漏洞,各主流服务都曾被爆文件解析漏洞,如下:
- IIS6.0解析漏洞1 - IIS6.0解析漏洞2 - IIS7.0/7.5解析漏洞 - Apache文件解析漏洞 - Nginx解析漏洞
(1)IIS6.0解析漏洞1 此洞原理是处理文件扩展名出错,导致将/*.asp/目录下的所有文件都作为asp文件进行解析。此外具有此特性的不单单是类似/*.asp/目录,还包括/*.cer /、/*.asa /、/*.cdx /、/*.cer \(此种类型浏览器直接输入不允许,需要借助burpsuite工具)、/*.asa \、/*.cdx \目录,本例子以/*.asp/目录举例。 (2)IIS6.0解析漏洞2 该漏洞的原理是IIS6.0不能正确够解析文件名包含分号(;)的文件,因此诸如2.asp;xx.jpg类似的文件会被解析成2.asp可执行文件,从而导致脚本被执行。此外具有此特性的不单单是类似2.asp;xx.jpg,还包括2.cer;xx.jpg、2.asa;xx.jpg、2.cdx;xx.jpg类型。
(3)IIS7.0/7.5解析漏洞 IIS7.0/7.5是对php 解析时有一个解析漏洞,只要在url后面追加上字符串"/任意文件名.php"就会按照php的方式去解析,其实这个漏洞是出自php-cgi的漏洞,与IIS7.0/7.5本身无关,具体例子如下。服务器端test.jpg代码为:<? php echo "Hello World"; ?>输入:http://[IP]/test.jpg/noexist.php,会将test.jpg当做php进行解析,其中noexist.php是不存在的文件(但后缀必须是.php)。
(4)Apache文件解析漏洞 Apache对于文件名的解析是从后往前解析的,直到遇见一个apache认识的文件类型为止,比如phpshell.php.rar.rar,由于apache不认识.rar文件类型,所以会一直遍历后缀直到.php,然后认为这是个php类型的文件,这样的话可以上传一个包含一句话木马文件名类似phpshell.php.rar.rar的文件,访问该文件将会被当成php文件解析执行,具有此漏洞的版本包括:Apache 2.2.11、Apache 2.2.17、Apache 2.2.6、Apache 2.0.59、Apache 2.2.8。
(5)Nginx(php cgi )解析漏洞 该漏洞是对一个任意文件名,在后面添加/任意文件名.php的解析漏洞,比如源文件名为nginx.jpg,可以添加成nginx.jpg/x.php,nginx就会把nginx.jpg当成php文件来解析,其实可以说这个漏洞与nginx本身关系不大,nginx只是作为一个代理把请求转发给fastcgi server,php在后端处理这一切,漏洞原因在fasgcgi方式下,php获取环境变量的方式有关,该漏洞官方没有补丁,php认为是一个新特性,为预防该漏洞官方建议修改php.ini文件中cgi.fix_pathinfo为0。
nginx还有一个自身的漏洞,就是它可以对任意文件名后面添加%00.php当成php文件来解析,该漏洞出现在nginx较低版本,包括nginx 0.5.*、nginx 0.6.*、nginx 0.7 <= 0.7.65、nginx 0.8 <= 0.8.37。
解决此漏洞的方法是:1)修改php.ini文件,将cgi.fix_pathinfo=0
2) 在Nginx配置文件中添加以下代码:
if ( $fastcgi_script_name ~ \..*\/.*php ) {
return 403;
}
这行代码的意思是当匹配到类似test.jpg/a.php的URL时,将返回403错误代码。
8、利用sql注入上传webshell
利用sql注入漏洞写入服务器端是比较常用的,本质上是利用SQL注入写文件功能,把WebShell写入。
9、利用WebDAV上传webshell
WebDAV大大扩展了HPPT协议中的GET、POST、HEAD等功能,利用其中的PUT、MOVE方法可以上传并修改上传的文件,从而获得WebShell,具体步骤如下: - 通过OPTIONS探测服务器信息 - 利用PUT方法上传文件 - 通过MOVE方法修改上传文件名 - 执行修改后的文件
10、利用.htaccess文件上传webshell
.htaccess文件的作用主要是对主配置文件没有访问权限,但又想改变某目录配置情况下使用,假如服务器端没有过滤后缀为.htaccess文件,那么攻击者可以构造该文件修改所在目录文件的配置,比如修改该文件下含“haha”字符串的所有文件按照php文件来解析,那么攻击者在上传构造的.htaccess文件后,再上传仍以后缀只有包含“haha”字符串的一句话木马文件,该文件会被当成php文件解析,具体如下:
- 建立特定.htaccess 文件 - 建立一句话木马文件 - 上传上述文件,并使用菜刀连接三、设计安全的文件上传功能
1、文件上传的目录设置为不可执行
在实际应用中,很多大型网站的上传应用,文件上传后会放到独立的存储上,做静态文件处理,一方面方便使用缓存加速,降低性能损耗;另一方面也杜绝了脚本执行的可能。
2、判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单的方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
3、使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用使用随机数改写了文件名和路径,将极大的增加攻击的成本。与此同时,像shell.php.rar.rar这种文件,或者是crossdomain.xml这种文件,都将因为文件名被改写而无法成功实施攻击。
4、单独设置文件服务器的域名
由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdoamin.xml、上传包含JS的xss利用等问题将得到解决。但能否如此设置,还需要看具体的业务环境。