文件上传

本文详细介绍了Web应用中常见的文件上传漏洞,包括JS检测、文件后缀、MIME类型、文件截断和竞争条件等绕过方法,并通过实例演示了绕过过程。同时,文章提出了使用白名单过滤和文件重命名等防御措施,以增强服务器端的安全性。
摘要由CSDN通过智能技术生成

一.漏洞成因

上传文件时,服务器端代码未对客户上传的文件进行严格的验证和过滤。

二.文件上传方式

1.JS检测绕过
成因:如果上传的文件名后缀不合法,则会弹窗告知,此时上传文件的数据包并没有发送到服务端,只是在客户端浏览器使用JavaScript对数据包进行检测。
绕过方法:(1).使用浏览器的插件,删除检测文件后缀的JS代码,然后上传即可绕过。(2).首先把需要上传的文件后缀改成允许上传的,绕过JS检测,再抓包,然后把后缀名改成可执行文件的后缀即可上传成功。
2.文件后缀绕过
成因:服务端代码限制了某些后缀的文件不允许上传,但有些Apache是允许解析其他文件后缀的,由于Apache的解析顺序是从右往左的,如果最右侧的扩展名不可识别,就继续向左判断,直到遇见可以解析的为止。
绕过方法:例如在httpd.conf中,如果配置有代码AddType application/x-httpd-php .php .phtml,则能够解析php和phtml文件,所以可以上传一个后缀为phtml的WebShell。
3.文件类型绕过
成因:如果服务器端代码是通过Content-Type的值判断文件类型,那么就存在被绕过的可能。
绕过方法:使用抓包工具修改Content-Type的值就可以绕过检测。
4.文件截断绕过
截断类型:PHP%00截断。
截断原理:由于00表示结束符,所以会把00后面的所有字符删除。
截断条件:PHP版本<5.3.4,q且PHP的magic_quotes_gpc为OFF状态。
绕过方法:服务端将GET参数jieduan的内容作为上传后文件名的第一部分,然后将按时间生成的文件名作为第二部分。例如修改参数jieduan为1.php%00.JPG,文件保存到服务器时,%00会把.jpg和按时间生成的图片文件名全部截断,那么文件名就只剩下1.php,webshell上传成功。
5.竞争条件
原理:一些网站上传文件的逻辑是先允许上传任意文件,然后检查文件是否包含wedshell脚本,如果包含就删除该文件。文件上传成功和删除文件之间有一个时间差(因为要执行文件检查和删除的操作),攻击者可以利用这个时间差完成攻击。

三、实例

<1>客户端绕过
事先我们可以将一句话php文件的后缀名改为可以上传的格式,这里我们上传1.jpg,然后用burp进行抓包,再将文件名后缀改回去即可。
在这里插入图片描述
在这里插入图片描述
由于这里是在前端做的验证,所以我们也可以将控制文件上传的函数删除进行上传,删除此函数,可以看到成功上传。
在这里插入图片描述
在这里插入图片描述
<2>服务端绕过(MIME type)
在做测试之前,我们先了解下什么是MIME type?
MIME(多功能网际邮件扩充协议)
MIME意为多目Internet邮件扩展,它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持之后,它的意义就更为显著了。它使得HTTP传输的不仅是普通的文本,而变得丰富多彩。
访问一个网页,获得一个资源后,浏览器通过哪种方式来识别这种资源呢?就是通过媒体资源类型MIME Type,媒体资源类型通过http协议,由web服务器告知浏览器,更详细的说,是通过Content-Type来定义的。
例如:Content-Type: text/HTML
通常只有一些在互联网上获得广泛应用的格式才会获得一个 MIME Type,如果是某个客户端自己定义的格式,一般只能以 application/x- 开头。

$html='';
if(isset($_POST['submit'])){
//     var_dump($_FILES);
    $mime=array('image/jpg','image/jpeg','image/png');//指定MIME类型,这里只是对MIME类型做了判断。
    $save_path='uploads';//指定在当前目录建立一个目录
    $upload=upload_sick('uploadfile',$mime,$save_path);//调用函数
    if($upload['return']){
        $html.="<p class='notice'>文件上传成功</p><p class='notice'>文件保存的路径为:{$upload['new_path']}</p>";
    }else{
        $html.="<p class=notice>{$upload['error']}</p>";
    }
}

可以看到这里服务端知识对文件的MIME类型进行了判断,那么我们抓包修改Content-Type的值即可进行绕过。这里直接上传shell.php,并抓包,修改Content-Type为image/jpg。成功上传。
在这里插入图片描述
<3>getimagesize()绕过
在进行测试之前,我们需要先了解一下getimagesize()函数,getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。这个函数功能会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的。所以不能通过修改content-type来达到目的,我们可以先合成一个图片马,windows下执行命令:

copy 1.jpg+shell.php 2.jpg

然后就可以直接上传了,成功上传。
在这里插入图片描述
虽然成功上传,但是文件格式为jpg,不能直接利用,所以我们可以配合文件包含让其解析该jpg文件中的php代码来获取shell。在pikachu本地文件包含中将filename替换为:…/…/unsafeupload\uploads\2021\05\15\874238609f598f6bfc2964912630.jpg,然后进行访问,成功解析。
在这里插入图片描述
最后我们可以用冰蝎进行连接获取webshell,这里获取成功。
在这里插入图片描述

四、防御方法

(1).使用白名单过滤。
(2).对上传后的文件重新命名。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值