前言
文件上传是很常用的功能点,如:上传头像、上传附件、保存文件等,文件上传漏洞的思想很简单,即可以将包含恶意代码的文件上传到服务器,并且能够解析执行,从而实现getshell。
首先,本文将介绍如何解析执行文件以及已知的一些解析漏洞;
然后,本文将讲解常见文件上传漏洞的防御方式以及绕过方法;
最后,本文会提供修复文件上传漏洞的建议。
解析&解析漏洞
Apache默认解析的后缀名
FilesMatch ".+\.ph(p[3457]?|t|tml)$">
IIS默认解析的后缀名
IIS6.0
.asp .asa .cer .cdx 通过aspnet_isapi.dll解析
Tomcat默认解析的后缀名
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
IIS解析漏洞
IIS6.0:
*.asa
或*.asp
格式的目录下的任意文件会被IIS当作asp文件来解析IIS6.0:当文件名为
*.asp;1.jpg
类型的格式时,会被IIS当做ASP脚本执行顺带提一下,当开启WebDav拓展,并且只是PUT、Move、Copy、Delete等方法时,可被上传恶意脚本
OPTIONS查看支持的方法
PUT上传文件
Move或Copy修改文件名
Apache解析漏洞
- Apache 1.x & 2.x:当Apache遇到不认识的后缀名时,如:
1.php.xx
,会从后往前依次尝试解析,直到发现认识的php
后缀名,遂当做PHP脚本解析。(apache认识的后缀名储存在/etc/mime.types)
Nginx解析漏洞
(PHP CGI解析漏洞):
http://ultramangaia.cn/gg.jpg
,在这个网址后面加上1.php
,即http://ultramangaia.cn/gg.jpg/1.php
,会被解析成PHP脚本。(php.ini文件中cgi.fix_pathinfo开启时/此漏洞也可能会出现在IIS7.0、IIS7.5、Lighttpd等,因为是PHP CGI的问题)空字节:
http://ultramangaia.cn/gg.jpg
,在这个网址后面加上%00.php
,即http://ultramangaia.cn/gg.jpg%00.php
会导致解析为PHP脚本nginx 0.5.*
nginx 0.6.*
nginx 0.7 <= 0.7.65
nginx 0.8 <= 0.8.37
文件上传漏洞防御及绕过方法
客户端校验
JavaScript 检查后缀名
绕过:Burp Suite 改后缀名
服务端校验
文件头content-type字段校验(eg. image/gif)
绕过:修改content-type字段
文件头校验(eg. GIF89a)
绕过:生成图片马绕过
后缀名黑名单/正则黑名单
绕过:黑名单覆盖不全时,可换后缀名绕过
绕过:大小写绕过
后缀名白名单/正则白名单
WAF
其他特性利用
Windows环境的奇葩规则,如会自动去掉不符合规则符号后面的内容
gaia.php[空格] gaia.php. gaia.php:1.jpg (注:生成的文件内容是空白的) gaia.php::$DATA gaia.php::$INDEX_ALLOCATION (注:生成文件夹) gaia.php::$DATA.jpg (注:生成0.jpg) gaia.php::$DATA\aaa.jpg (注:生成aaa.jpg)
上传
.htaccess
改变解析方式AddType application/x-httpd-php xxx
会将xxx后缀的文件,用PHP解析,
或者
<FilesMatch "shell.jpg"> SetHandler application/x-httpd-php </FilesMatch>
会将
shell.jpg
用PHP解析。
文件上传漏洞修复建议
- 白名单机制
- 强行重命名为特定后缀名
- 检查文件内容
- 文件保存随机的文件名,在数据库中映射后缀,返回时,设置Content-Type
- 隐藏文件路径
- 文件路径在web目录之外,不能直接访问到
- 将上传的文件保存到OSS(阿里云)
- 。。。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至3213359017@qq.com