目录
什么是文件上传漏洞
对于具有文件上传功能点的地方,都有可能上传可执行的脚本文件,并通过此脚本文件获得服务器权限。
文件上传功能验证类型
-
客户端JavaScript验证
-
服务端MIME类型验证
-
服务端文件扩展名验证
-
白名单
-
黑名单
-
-
服务器文件内容验证
-
文件头
-
文件加载检测
-
文件上传功能验证绕过
一、客户端JavaScript验证绕过
-
修改或删除关键的检测函数,或者通过浏览器插件直接禁用JavaScript
-
通过Burp抓包,将抓取的内容进行修改,从而绕过前端JavaScript检测
二、服务端MIME类型检测绕过
-
使用Burp抓包,修改Content-Type类型实现绕过
三、服务器文件内容验证绕过
-
修改文件头(文件幻数)
常见文件幻数
-
JPG:FF D8 FF E0 00 10 4A 46 49 46
-
GIF:47 49 46 38 39 61(GIF89a)
-
PNG:89 50 4E 47
-
四、服务端文件扩展名验证-黑名单
-
上传特定的配置文件.htaccess
<FilesMatch “shell.jpg”> SetHandler application/x-httpd-php </FilesMatch>
shell.jpg 即可以php脚本解析
-
shell.php::$DATA,Windows系统下PHP服务器会将后缀名带::$DATA的文件当作文件流处理,过滤不起作用,上传到服务器之后,截取::之前的格式作为文件后缀,也就是shell.php
-
抓取数据包,在文件名最后加空格实现绕过
-
抓取数据包,在文件名最后加点进行绕过
-
后缀名大小写绕过,例如.Php
-
双写后缀名绕过,例如.pphphp
-
罕见的文件后缀名在设计黑名单时容易被遗忘,如.php5、.phtml、.phps、.pht文件进行上传,从而实现绕过
五、服务端文件扩展名验证-白名单
-
%00截断绕过
-
条件竞争
六、中间件之服务器解析漏洞
-
Apache解析漏洞
-
apache解析文件规则是从右向左,例如shell.php.a.b.c,识别不出.c后缀名则会依次往前识别,直到识别为php时,才会被解析
-
AddHandler导致的解析漏洞
如果服务器给.php后缀添加了处理器:AddHandler application/x-httpd-php.php就会导致类似shell.php.jpg这类多后缀的文件以php文件的形式进行解析,能够很好的绕过白名单
-
Apache换行解析漏洞(CVE-2017-15715)
影响版本:2.4.0-2.4.29
合法后缀配置文件中的正则表达式中$不仅匹配字符串结尾位置,还匹配\n或者\r,在解析php时,1.php\x0A将按照.php进行解析,而"".php\x0A"!=".php",即实现了黑名单的绕过。
-
-
IIS解析漏洞
-
目录解析
影响版本:IIS 6.x
目录名为.asp、asa、cer,则目录下的所有文件都会被作为asp解析
-
文件解析
影响版本:IIS 6.x
文件名中分号后不被解析,例如asp;、asa;、cer;
url/test.asp;shell.jpg会被当作asp脚本执行
-
文件类型解析
影响版本:IIS 6.x
.asa、.cer、.cdx都会被当作aso文件执行
url/shell.asa会被作为asp文件执行。
-
FastCGI配置错误
影响版本:IIS 7&&IIS 7.5
利用条件:
-
以Fast CGI运行
-
cgi.fix_pathinfo=1(全版本PHP默认为开启)
使得当你访问任意URL时,在URL后面添加“/x.php”,该文件都会被IIS当php文件进行解析。
-
-
-
Nginx解析漏洞
-
PHP+nginx默认是以cgi的方式去运行的,当用户配置不当(cgi.fix_pathinfo默认开启),且URL中不存在访问的文件,PHP就会向前递归解析,就会导致任意文件被当作php去解析。
利用条件:
-
以Fast CGI运行
-
cgi.fix_pathinfo=1(全版本PHP默认为开启)
满足以上条件时,当你访问url/shell.jsp/shell.php时,你上传的shell.jpg会被当作php去执行,
在Nginx<=0.8.37版本时,即使关闭了Fast CGI,在这个文件路径(/x.jpg)后面加上%00.php则依旧会解析为php文件。除了使用%00还可以上传一个任意名称的jpg文件,包含:<?php fputs(fopen('shell.php','w'),'<?php eval($POST[cmd])?>');?>,访问test.jpg/.php则会在当前目录生成恶意文件shell.php。
-
-
-
-
Nginx文件名逻辑漏洞
影响版本:Nginx 0.8.41~1.4.3/1.5.0~1.5.7
利用过程:
-
上传"shell.jpg "文件,注意文件名后面为空格
-
访问"url/shell.jpg[0x20][0x00].php"
(两个中括号中的数字是用Burp在Hex界面修改)
-
-
七、利用CMS、编辑器漏洞
八、WAF绕过
安全修复
-
服务端文件扩展名使用白名单检测+文件名重命名
-
对文件内容进行检测
-
WAF防护软件:宝塔,云盾等。