详解文件上传漏洞

介绍

在现代互联网网站中,上传文件基本上是一种常见的功能,允许用户上传一些图片,视频以及其他类型的文件。如果网站出现文件上传漏洞,那么恶意用户就可以将可执行脚本程序上传到web服务器中,获得网站权限,进一步 gongji web服务器。
当上传文件时,如果服务端未对客户端上传的文件进行严格的验证和过滤,就容易造成文件上传漏洞,即上传任意文件(包括脚本文件php,jsp,asp,aspx等格式)
恶意用户可以利用上传的webshell控制整个网站甚至控制服务器

绕过

js检测绕过
js检测绕过漏洞常见于用户上传文件时,如果后缀不允许,则弹窗告知,此时上传文件的数据包并没有上传到服务端,只是在客户端浏览器使用JavaScript进行检测

此时有两种方法进行绕过
1.使用浏览器插件删除检测文件后缀的JavaScript代码,然后上传文件
2.先把需要上传的文件后缀改为允许上传的后缀绕过JavaScript代码的检测,再抓包修改为原来的后缀即可成功


可以看到成功绕过js检测上传文件成功
文件后缀绕过
文件后缀绕过是服务端限制了某些后缀的的文件不允许上传,but 有些Apache是允许解析其它文件后缀的,例如在Apache配置文件httpd.conf中有以下代码则能够解析php和phtml文件
AddType application/x-httpd-php .php .phtml


在Apache解析顺序中是从右到左开始解析文件后缀的,如果最右侧的扩展不识别就继续往左判断,直到遇到可以解析的文件后缀为止,所以如果上传的文件名类似为luguo.php.xxx,因为后缀xxx不可以解析则向左解析为luguo.php
文件类型绕过
此类绕过需要简单的两次判断
用burp suite抓包
当上传php文件时

可以看到数据包中的Conetent-Type的值是application/x-php
上传jpg文件时

可以看到数据包中的Content-Type的值是image/jpeg
可以推断出服务端是通过Content-Type的值来判断文件的类型,那么就可以进行绕过了,因为Content-Type的值是通过客户端传递的,是可以进行修改的,我们只需要在上传php文件时,在Burp suite中将Content-Type修改为image/jpeg,就可以绕过检测

在php中还有一种文件上传漏洞,php调用函数getimagesize()获取图片长宽高等信息,如果上传的不是图片那么getimagesize()就获取不到信息则不允许上传,but 我们可以将图片和webshell合并成一个文件,敲下方命令
cat index.png luguo.php > snowwolf.php


访问上传的地址,上传成功
文件截断绕过
在php中00代表结束符,所以会把00后面的所有字符删除
截断条件php版本小于5.3.4,php的magic_quotes_gpc为off

上传文件时服务端将Get参数name的内容为文件名的前一部分,后面则按时间生成的图片为第二部分
修改参数截断为luguo.php%00.ipg,文件保存到服务器时,%00会把.jpg和按时间生成的图片名全部截断,文件名就剩下luguo.php,因此成功上传webshell
竞争条件绕过
一些网站的逻辑是先允许上传任意文件,然后检查是否包含webshell脚本,如果包含则删除。这里存在的漏洞是文件上传成功后和删除操作有个时间差,恶意用户利用时间差就可以完成竞争条件的gongji。
gongji者先上传一个webshell脚本snowwolf.php,snowwolf.php是生成一个新的webshell脚本,内容如下
fputs(fopen('../shell.php','w'),'');
?>


当snowwolf.php上传成功时,gongji者立即访问snowwolf.php,则会在服务端立即生成shell.php文件,完成gongji


可以看到已经生成shell.php文件
ps:单身多年的手速可算派上用场了

修复建议

通过白名单的方式来判断文件后缀的合法
对用户上传的文件重命名

文件上传漏洞网页演示源码链接:https://pan.baidu.com/s/1V5b7_FvQjd4yKdaoDbBXCw
提取码:5i89

转载于:https://blog.51cto.com/superwolf/2361156

你可能感兴趣的:(php,shell,javascript)