文件上传漏洞技巧
简介
文件上传漏洞是web安全中经常利用到的一种漏洞形式。一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以上传的地方将恶意代码植入到服务器中,再通过url去访问以执行代码。
但在一些安全性较高的web应用中,往往会有各种上传限制和过滤,导致我们无法上传特定的文件。
绕过验证方式
一、客户端验证绕过
这种类型的绕过也非常简单,我们可以关闭浏览器上的JavaScript或是在浏览器发出请求之后,在被发送至服务器之前来篡改该HTTP请求即可。
例如再upload-labs-master的第一关当中,就可以采用绕过js验证,如下所示:
1.禁用全局的
2.把检查文件注销掉。
第二种方式:抓包改文件名
思路,我们可以创建一个shell.php文件,将其后缀名改为png格式,在抓包之后,将其后缀名改回php,就可以完成上传
修改完成之后,上传成功!
详细的结果可以查看https://www.cnblogs.com/hmesed/p/15754668.html
二、服务端绕过
服务端:黑白名单策略
白名单策略:
服务器有一份可上传文件的名单后缀,满足其后缀,即可放行传输。
黑名单策略:
服务器会检查上传文件的后缀名,只要符合和名单里面的禁止后缀名,就会被拦截:如
服务端--------》.htaccess绕过
黑名单里拒绝了几乎所有有问题的后缀名,除了.htaccess;、
前提条件httpd.conf的两个开关设置要求:(1.mod_rewrite模块开启。2.AllowOverride All)
第一步:先上传一个.htaccess文件(该目录的所有文件可以php文件执行),内容如下:SetHandler application/x-httpd-php
第二步:然后再上传一句话木马(后缀名修改为jpg)
服务端---------》大小写绕过
1、检测原理
后端过滤函数中不包括,$file_ext = strtolower($life_ext);//转换为小写且所有后缀名过滤都过滤,如图所示:
2、绕过方法
修改后缀名为大写
详情请见:https://www.cnblogs.com/hmesed/p/15756548.html(大小写绕过)
服务端-------》空格绕过
1、检测原理
后端过滤函数中不包含,$file_ext = trim($file_ext);//首尾去空且所有后缀名过滤都过滤
2、绕过方法
修改后缀名增加空格
详情请见:https://www.cnblogs.com/hmesed/p/15757963.html
服务端------》.点绕过
1、检测原理
后端过滤函数中不包括,$file_name = deldot($file_name);
//删除文件名末尾的点且所有后缀名过滤都过滤,利用Windows特性,会自动去掉后缀名中最后的“ . ”,可在后缀名中加“ . ”绕过。
2、绕过方法
修改后缀名中增加 . 号
详情请见:https://www.cnblogs.com/hmesed/p/15758646.html
服务端-----》::$DATA绕过
1、检测原理
后端过滤函数中不包括,$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA,后端没有对后缀名中的‘::$DATA’进行过滤,在php+windows的情况下,
如果文件名+“::$DATA”会把::$DATA之后的数据当成文件流处理,不会检测后缀名. 且保持"::$DATA"之前的文件
2、绕过方法
利用Windows特性,可在后缀名中加“::$DATA”绕过
服务端-------》点+空格+点绕过
1、检测原理
保存文件的时候没有重命名而使用原始的文件名,导致可以利用1.php. .(点+空格+点)来绕过,条件比较苛刻
2、绕过方法
修改后缀,利用 1.php. . (点+空格+点)来绕过
服务端--双写绕过
1、检测原理
后端处理函数中包含了 str_ireplace($deny_ext,“”,$file_name);
2、绕过方法
把后缀名更改为pphphp
服务端--00截断
1、检测原理
后端采用白名单判断,但图片的路径是直接拼接出,例如:$img_path = $_GET['save_path']."/".rand(10,99).date("YmdHis").".".$file_ext;
2、绕过方法
可以利用%00截断绕过(传入save_path参数时加上);但是有条件截断条件:php版本小于5.3.4,php的magic_quotes_gpc为OFF状态
0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当作结束符,而%00,是url对ascii编码再加%处理,url反编码后一样。
服务端--图片马绕过
1、检测原理
通过读写文件的前2个字节判断文件类型
2、绕过方法
上传图片马
getimagesize()-图片马
1、检测原理
通过getimagesizi获取图片文件的类型
2、绕过方法
上传图片马即可
exif_imagetype()-图片马
1、检测原理
获取图片中文件的类型
2、绕过方法
需要开启php的配置文件的php_exif模块,上传图片马
服务端--二次渲染绕过
1、检测原理
文件上传成功后,经过二次渲染,所谓二次渲染就是重新在生成一次图片,容易把图片马中的PHP代码修改掉。
2、绕过方法
php代码不能放在最后,对于不同的图片,修改的位置还不一样。
服务端--条件竞争
1、检测原理
条件竞争,先将文件上传到服务器,然后判断文件后缀是否在白名单里,如果在则重命名,否则删除,因此可以上传1.php只需要在它删除之前访问即可,可以利用burp的intruder模块不断上传,然后我们不断的访问刷新该地址即可;目的就是在文件还存在时执行一段php代码,比如新建一个文件,写入一句话。
代码:file_put_contents('webshell.php','<?php @eval($_POST[pass]); ?>');