一.文件上传漏洞原理
网站Web应用都有一些文件上传功能,比如文档、图片、头像、视频上传,当上传功能的实现代码没有严格校验上传文件的后缀和文件类型,此时攻击者就可以上传一个webshell到一个Web可访问的目录上,并将恶意文件传递给如PHP解释器去执行,之后就可以在服务器上执行恶意代码,进行数据库执行、服务器文件管理,服务器命令执行等恶意操作。还有一部分是攻击者通过Web服务器的解析漏洞来突破Web应用程序的防护。
二.文件上传绕过方式
1.客户端JavaScript检查
客户端检测一般只是在JavaScript代码中加入了对扩展名的黑白名单检查,这种方式只能防止一些普通用户上传错误,只要用Burpsuite在文件上传时进行截断改文件后缀名就可绕过。
2.服务端检测
A.MIME
类型的检查
就是检查Content-Type的值,MIME类型决定了某种扩展名用什么应用程序打开,GIF的MIME值为image/gif。
B.
文件扩展名检查
与前端js后缀名检测类似,只不过是在后端进行检查,有时候还可以配合解析漏洞结合目录路径攻击,例如test.asp/test.jpg。后端后缀名检查也分两种,黑名单与白名单。
黑名单检查绕过:
- 文件名大小写绕过,例代码中有php规则,那么可以使用PHP或pHP绕过。
- 黑名单列表绕过,对黑名单列表中没有的扩展名进行攻击,比如asa、cer等。
- 利用windows和Linux系统的特性进行特殊文件名绕过,a.asp. a.asp_等。
- htaccess 文件攻击。
- 配合解析漏洞(IIS、Apache等)。
白名单绕过:
- 截断攻击,比如a.asp%00.gif等。
- 配合解析漏洞。
C.
目录路径的检查
对目录路径可进行0x00截断绕过;以及可以控制目录地址,上传文件夹的参数可控)
D.
检测文件内容是否包含恶意代码
这种方式主要检查图片文件的幻数,比如GIF的值为GIF89a,后端代码会检测改值判断是否为GIF图片文件,想要绕过只要在幻数后面加上一句话木马就行。
F.
解析漏洞
F-1 IIS解析漏洞
IIS6.0在解析文件时存在以下两个解析漏洞:
- 当建立*.asa、*.asp格式的文件夹时,其目录下的任意文件都将被IIS服务器当作asp文件来解析。
- 在IIS6.0下,分号后面的扩展名不会被解析,也就是说当文件名为 *.asp;.jpg时,IIS6.0同样会以ASP脚本来执行。
F-2 Apache解析漏洞
在Apache 1.x和Apache 2.x中存在解析漏洞,但他们与IIS解析漏洞不同。
Apache在解析文件时有一个规则:当碰到不认识的扩展名时,将会从后向前解析,直到碰到认识的扩展名位置,如果都不认识,则会暴露其源码,比如文件名为php.rar.xx.aa时Apache首先会解析aa扩展名,如果不认识则接着解析xx扩展名,这样一直遍历到认识的扩展名为止,然后再将其进行解析。
F-3 PHP CGI解析漏洞
在PHP的配置文件中有一个关键的选项:cgi.fi: x_pathinfo,这个选项在某些版本是默认开启的,在开启时访问url,比如:
http://www.xxx.com/x.txt/x.php
,其中x.php是不存在的文件,所以php将会向前递归解析,于是就造成了解析漏洞。由于这种漏洞常见于IIS7.0、IIS7.5、Nginx等Web服务器,所以经常会被误认为是这些Web服务器的解析漏洞。
F-4 Nginx<8.03空字节代码执行漏洞
影响版本 :0.5,0.6,0.7<=0.7.65 0.8<=0.8.37
Nginx在图片中嵌入PHP代码,然后通过访问xxx.jpg%00.php可以执行其中的代码。
F-5 其他
在Windows环境下,xx.jpg[空格]或xx.jpg.这两类文件都是不允许存在的,若这样命名Windows会默认除去空格或点,攻击者可以通过抓包在文件名后加一个空格或者点绕过黑名单。若上传成功,空格和点都会被Windows自动消除,这样也可以getshell。
如果在Apache中配置文件.htaccess可被执行且可被上传,那可以尝试在.htaccess中写入:SetHandlerapplication/x-httpd-php,然后再上传名称为shell.jpg的webshell,这样shell.jpg就可解析为php文件。