上传漏洞
1.文件上传漏洞概述
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。
文件上传本身是一个正常的业务需求,对于很多网站来说,需要用户将文件上传到服务器。文件上传本身是没有问题的,出现问题的地方在于服务器怎么处理、解释文件。所以,攻击者在利用上传漏洞时,通常会与Web容器的解析漏洞配合在一起。这里我们先了解一下什么是解析漏洞。
2. 解析漏洞
常见的Web容器有IIS、Nginx、Apache、Tomcat等。
2.1 IIS解析漏洞
(1)目录解析 (6.0)
形式:www.xxx.coom/123.asp/abc.jpg
原理:服务器默认会把.asp .asa 目录下的文件都解析成asp文件
(2)文件解析
形式:www.xxx.coom/123.asp;.jpg
原理:服务器默认不解析分号后面的内容,因此123.asp;.jpg被解析成asp文件(用于只允许jpg文件上传时)
2.2 Apache解析漏洞
Apache(1.x 和2.x)解析文件是从右到左开始判断的,如果不能识别,就继续向左判断。
所以,当文件名为1.php.aaa.bbb.ccc时,服务器解析为php文件
2.3 PHP CGI 解析漏洞
形式:www.xxx.coom/123.jpg/abc.php
利用:123.jpg被当作php文件解析,abc.php是不存在的,这意味着攻击者可以上传合法的“图片”,然后在URL后面加上“/xxx.php”,就可以获得网站的WebShell。
原理:这种解析漏洞其实是PHP CGI的漏洞。在PHP的配置文件夹中有一个关键的选项:cgi.fi:x_pathinfo。这个选项在某些版本是默认开启的。在开启时访问URL,www.xxx.coom/123.jpg/abc.php,abc.php是不存在的文件,所以PHP将向前递归解析,于是造成解析漏洞。
3. 上传漏洞检测方法及绕过
3.1 客户端js验证
客户端使用js检测,在文件未上传时,就对文件进行验证;
在浏览器禁用js,可以直接绕过
3.2 服务器端MIME类型检测
服务器端检测一般会检测文件的MIME类型,检测文件扩展名是否合法,甚至有还会检测文件中是否嵌入恶意代码
这种方法是通过Content-Type判断文件类型。这里对一个php文件的上传过程进行抓包:
这里可以看到Content-Type的值,我们先了解一下Content-Type常见的媒体格式的类型:
- text/html : HTML格式
- text/plain :纯文本格式
- text/xml : XML格式
- image/gif :gif图片格式
- image/jpeg :jpg图片格式
- image/png:png图片格式
修改content-Type值为允许上传的文件类型格式,显示上传成功:
3.3 服务器目录路径检测
在文件上传时,程序通常允许用户将文件放到指定的目录中,然而有些Web开发人员为了让代码更健壮,通常会做一个操作,如果指定目录存在,就将文件写入目录中,不存在先建立目录,然后写入。
然而这正是引发漏洞的关键点,,因为在HTML代码中有一个隐藏标签<input type="hidden" name="Extension" value="up"/>,这是文件上传是默认的文件夹,而我们对参数是可控的,如:将value值改为test.asp,并提交上传一句话木马文件。
程序在接收到文件后,对目录判断,如果服务器不存在pentest.asp目录,将会建立此目录,然后再将图片一句话密码文件写入test.asp目录,如果Web容器为IIS 6.0,那么网页木马会被解析。
3.4 服务器文件扩展名检测
3.4.1 白名单验证
白名单定义了允许上传的文件扩展名。
白名单的过滤方式可以防御未知风险,但不能完全依赖白名单。前面有讲到,在IIS 6.0中可以利用1.asp;1.jpg绕过白名单。
3.4.2 黑名单验证
黑名单定义了一系列不安全的扩展名,服务器端在接收文件后,与黑名单扩展名对比,如果发现文件扩展名与黑名单扩展名匹配,则认为文件不合法。
绕过方法:
(1)黑名单漏掉的扩展名,如:cer;
(2)可能存在大小写绕过漏洞,如:aSp和pHp之类
(3)Windows下,文件名以“.”或空格结尾,系统会自动去除,利用此特性也可以绕过黑名单验证。
4. 修复上传漏洞
上传漏洞最终形成原因主要有以下两点:
1. 目录过滤不严,攻击者可能建立畸形目录;
2. 文件未重命名,攻击者可能利用Web容器解析漏洞。
预防手段:
1. 接收文件及其文件临时路径;
2. 获取扩展名与白名单做对比,如果没有命令,程序退出;
3. 对文件进行重命名。