一文解读文件上传漏洞
一、简介:
1.1、文件上传概念:
文件上传这件事本身并没有问题,当网站没有对上传的文件进行处理,解释直接存放在可猜解目录下,攻击者就可以通过上传一个恶意文件,然后访问该恶意文件进行任意操作。
1.2、WebShell概念:
WebShell是一个网页后门,是以php,jsp,asp等网页文件形式存在的一种命令执行环境。
如php一句话木马
<?php @eval($_POST[cmd]);?>
攻击者通过上传一个php文件木马,攻击者通过POST请求上传cmd可以执行eval()函数下的任何操作。
1.3、文件上传漏洞流程:
攻击者在一个网站发现文件上传漏洞点后,上传一些恶意文件,将这些jsp或者php后门上传至网站服务器,将这些后门与网站正常网站文件混在一起去,然后获取网站文件存储路径进行访问恶意文件,得到命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)。
1.4、文件上传漏洞产生原因:
-
对于上传文件的后缀名(扩展名)没有做较为严格的限制
-
对于上传文件的MIMETYPE(用于描述文件的类型的一种表述方法) 没有做检查
-
服务器配置不当,当服务器配置不当,在不需要上传页面的情况下便可导致任意文件上传,如开启HTTP PUT方法;
-
对于web server对于上传文件或者指定目录的行为没有做限制
-
文本文件上传限制被绕过,比如客户端做了限制,但服务器没有做,只要修改数据包即可绕过
-
文件解析漏洞导致文件执行存在此漏洞时,即使合法的文件名,但文件名中的恶意代码也有可能被执行。
-
文件路径截断
1.5、文件上传漏洞判断:
二、文件上传常见绕过方式:
2.1:前端校验文件绕过
2.1.1:前端js代码校验后缀:
绕过方式:
1:修改文件文件后缀名,burp代理修改文件后缀名进行上传。
2:禁用页面js。
改包:
上传成功并存在文件保存路径:
2.2、后端校验文件绕过:
在文件被上传到服务端的时候,对文件名的扩展名,MIME type等信息进行检查,如果不合法,则拒绝这次上传并返回。
2.2.1、检查后缀:
2.2.1.1、黑名单:
查看源码,发现黑名单禁用常见后缀
修改php后缀为phtml,php5等后缀绕过黑名单
(1)常见后缀绕过:
PHP: php2,php3,php5,phtml,pht
JSP: jsp,jspx,jspf
ASP: asa,cer,cdx
ASPX: ascx,ashx,asac
(2).htaccess绕过:
.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
利用原理:
<FilesMatch "evil.gif">
SetHandler application/x-httpd-php #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
AddHandler php5-script .gif #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
</FilesMatch>
利用方式:上传覆盖.htaccess
文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析。
2.2.1.2、白名单:
(1)MIME绕过(Content-Type):
MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。
MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
以text开头的媒体格式类型:
text/html: HTML格式。
text/plain:纯文本格式。
text/xml: XML格式。
以image开头的媒体格式类型:
image/gif:gif图片格式。
image/jpeg:jpg图片格式。
image/png:png图片格式。
以application开头的媒体格式类型:
application/xhtml+xml:XHTML格式。
application/xml: XML数据格式。
application/atom+xml:Atom XML聚合格式 。
application/json: JSON数据格式。
application/pdf:pdf格式 。
application/msword: Word文档格式。
application/octet-stream: 二进制流数据(如常见的文件下载)。
application/x-www-form-urlencoded: 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)。
上传文件时类型:
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式。
有些网站会校验文件的MIME形式是否与文件后缀相符,如果单一抓包修改文件后缀不修改MIME类型仍旧会上传文件失败。
(2)%00截断:
%00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以\0(即0x00)作为字符串的结尾。操作系统在识别字符串时,当读取到\0字符时,就认为读取到了一个字符串的结束符号。因此,我们可以通过修改数据包,插入\0字符的方式,达到字符串截断的目的。00截断通常用来绕过web软waf的白名单限制。
条件:
-
php版本小于5.3.29
-
magic_quotes_gpc = Off
2.2.2、检查内容:
二次渲染绕过:
2.2.3、代码逻辑:
条件竞争
三、文件上传常见防御措施:
- 上传文件的存储位置与服务器分离;
- 上传的文件重新修改文件名、文件后缀名;(如何确定后缀名防止修改:前端传递,后端再校验)
- 文件上传的上传保存路径根据业务进行分离;下载时根据重新生成的文件名进行下载;
- 文件上传的目录设置为不可执行。只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响
- 判断文件类型。在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,最好推荐白名单方式,黑名单方式存在很大的风险被绕过。
- 单独设置文件服务器的域名。由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决