文件上传漏洞
一、概要
通常是由于对上传文件的类型、内容没有进行严格的过滤、检查或者过滤被成功绕过,使得攻击者可以通过上传木马获取服务器的webshell权限
1.什么是webshell
非法用户上传恶意脚本文件控制整个网站,甚至控制整台服务器。这个恶意的脚本文件,又被称为webshell,也称作网页后门
二、漏洞成因
1.服务器配置不当
当服务器配置不当时,在不需要上传页面的情况下便可导致任意文件上传,参考HTTP请求方法(PUT)
2.开源编辑器上传漏洞
很多开源的编辑器历史上都有不同的上传漏洞
3.本地文件上传限制被绕过
只在客户端浏览器上做了文件限制而没有在远程的服务器上做限制,只需要修改数据包就可以轻松绕过限制
4.过滤不严或被绕过
有些网站上使用了黑名单过滤掉了一些关键的可执行文件脚本后缀等,但黑名单不全或者被绕过,导致可执行脚本文件被上传到服务器上执行
常用的一些可执行的文件脚本的后缀:Php,php2,php3,php5,phtml,pht,asp,aspx,ascx,ashx,cer,jsp,jspx
5.文件解析漏洞导致文件执行
当服务器上存在文件解析漏洞时,合法的文件名便可导致带有恶意代码的文件被执行
6.文件路径截断
在上传的文件中使用一些特殊的符号,使得文件被上传到服务器中时路径被截断从而控制文件路径
常用的进行文件路径截断的字符如下:\0、?、%00
在可以控制文件路径的情况下,使用超长的文件路径也有可能会导致文件路径截断
三、解析漏洞
解析漏洞是指web服务器因对http请求处理不当导致将非可执行的脚本/文件等当做可执行的脚本/文件等执行。该漏洞一般配合服务器的文件上传功能使用,以获取服务器的权限
1.IIS 5.x/6.0解析漏洞
在网站下建立文件夹的名称中带有asp、asa、cer、cdx等可执行脚本文件后缀为后缀的文件夹,其目录内的任何扩展名的文件都被IIS当作可执行文件来解析并执行
例如,页面允许用户上传文件,也允许用户在服务器上新建文件夹,此时一个用户想上传一个asp木马(服务器禁止上传asp文件),那么该用户只需要新建一个xxx.asp的文件夹,并在文件夹内新建一个txt/图片(无论新建什么),IIS都会把它当作asp脚本执行,如:http://www.xxx.com/xx.asp/xx.jpg
文件解析:在IIS6.0下,分号后面的不被解析,也就是说xx.asp;.jpg将被当做xx.asp解析并执行,例如:http://www.xxx.com/xx.asp;.jpg
IIS6.0 默认的可执行文件有asp、asa、cer、cdx四种
2.IIS 7.0/IIS 7.5 或者 Nginx <0.8.3 畸形解析漏洞
在默认Fast-CGI开启状况下,访问以下网址,服务器将把xx.jpg文件当做php解析并执行
http://www.xxx.com/xx.jpg/.php
3.Nginx <8.03 空字节代码执行漏洞
影响范围:Nginx0.5.,0.6., 0.7 ⇐ 0.7.65, 0.8 ⇐ 0.8.37
访问以下网址,服务器将把xx.jpg文件当做php解析并执行
http://www.xxx.com/xx.jpg.php
4.CVE-2013-4547 Nginx解析漏洞
http://www.xxx.com/a.jpg\0.php
http://drops.wooyun.org/tips/2006
5.Apache解析漏洞
Apache对文件解析是从右到左开始判断解析,如果文件的后缀为不可识别,就再往左判断,解析。 如xx.php.owf.rar,由于Apache无法解析rar和owf后缀,但能够解析php后缀,因此Apache会将xx.php.owf.rar当做php格式的文件进行解析并执行
访问以下网址,服务器将把xx.php.owf.rar文件当做php解析并执行
http://www.xxx.com/xx.php.owf.rar
四、文件上传判断思路
五、一句话木马
<?php @eval($_POST['x']); ?>
@的作用:无视报错信息,继续执行后续命令
eval():把括号内的数据转换成指令执行,例:phpinfo();和eval("phpinfo();");的作用是一样的,只不过是执行指令的两种写法
$_POST(超文本传输变量):获取用户的post表单内容
PHP函数(方法)不区分大小写,变量区分大小写【与JS和HTML有区别】,所以不能写成post,但可以写成EVAL
PHP中$开头的都是变量
PHP字符串拼接:'ab' . 'cd' = 'abcd'
六、绕过上传漏洞
1.客户端验证
①浏览器禁用JS---about:config
②使用浏览器插件,比如FireBug之类,删除检测文件后缀的JS代码,然后上传文件即可
绕过
③首先把需要上传的文件的后缀改成允许上传的,如jpg,png等,绕过JS的检查,再抓包,
把后缀名改还原后即可上传成功
2.文件后缀绕过
文件后缀绕过攻击是服务器代码中限制了某些后缀的文件不允许上传。但是有些Apache是允许解析其它文件后缀的,例如在httpd.conf中,如果配置有AddType application/x-httpd-php .php .phtml代码,则能够解析php和phtml文件,所以可以上传一个后缀是phtml的webshell
在Apache的解析顺序中,是从右向左开始解析文件后缀的,如果最右侧的扩展名不可识别,就继续往左判断,直到遇到可以解析的文件后缀为止。所以如果上传的文件名类似 1.php.xxxx,因为后缀xxxx不被识别,所以向左解析后缀php
3.文件类型绕过
如果服务端代码只是通过Content-Type的值来判断文件的类型,那么就存在被绕过的可能。所以当上传一个php文件时,在burp当中将Conten-Type修改为 imag/jpeg,就可以绕过服务器的检测
PHP函数getimagesize()可以获得图片的宽、高等信息,如果上传的不是图片文件,那么此函
数就得不到相关信息,则不允许上传。我们可以将一个图片和一个webshell合并为一个文件(图片码),此时,该函数就可以获取图片信息,且webshell的后缀是php,也能被Apache解析为脚本文件,通过这种方式就可以绕过此函数的限制
4.服务端验证
①黑名单验证
Ⅰ.攻击者可以从黑名单中找到web开发人员忽略的扩展名,如:cer
Ⅱ.文件扩展名大小写转换,aSp、phP,此类扩展名在Win平台依然会被web容器解析
Ⅲ.在Win系统下,如果文件名以“.”或者空格作为结尾,系统会自动去除“.”与空格,利用此特性也可以绕过黑名单验证。如:上传“asp.”或者“asp ”服务器端接收文件名后在写文件操作时,Windows将会自动去除小数点和空格
Ⅳ.%00截断
②白名单验证
配合解析漏洞,例如:WEB容器是IIS6.0,上传验证为白名单的JPG格式test.asp;test.jpg就可以通过验证,但IIS6.0却会把文件当成test.asp脚本来执行
③MIME验证
修改HTTP请求中的 Content-Type,如修改为:image/jpeg
5.竞争条件
一些网站上传文件的逻辑是:先允许上传任意文件,然后检查上传的文件是否包含WEBSHELL脚本,如果包含则删除该文件。这里存在的问题是上传成功后和删除文件之间存在一个短的时间差(因为要执行检查文件和删除文件的操作)。攻击者就可以利用这个时间差完成竞争条件的上传漏洞攻击
攻击者先上传一个WEBSHELL脚本10.php,10.php的任务是生成一个新的WEBSHELL脚本shell.php
10.php的代码如下:<?php fputs(fopen('../shell.php', 'w'), '<?php @eval($_POST[a]) ?>'); ?>
PHP中提供了一个叫做eval()的函数,如一句话木马就是使用了这个函数,eval()函数可以把字符串按照PHP代码来执行,就是可以动态执行PHP代码
七、漏洞修复
1.服务器配置不当
重新配置好服务器
2.开源编辑器上传漏洞
若新版编辑器已修复漏洞,请更新编辑器版本
3.本地文件上传限制被绕过
在服务器后端对上传的文件进行过滤
4.过滤不严或被绕过
建议使用白名单的方法判断文件后缀是否合法
5.文件解析漏洞导致文件执行
升级web服务器版本或安装相应的官方补丁
6.文件路径截断
对上传后的文件进行重命名,例如 rand(10,99).date("YmdHis").".jpg",使用随机数改写文件名和文件路径,不要使用用户定义的文件名和文件路径
除了以上的方法之外,还可将被上传的文件限制在某一路径下,并在文件上传目录禁止脚本解析
标签:文件,解析,后缀,漏洞,服务器,php,上传 From: https://www.cnblogs.com/vinslow/p/17052459.html