目录
一、基础上传漏洞(太过简单目前环境不可能存在)
1、抓包然后改后缀进行绕过
2、抓包然后改上传文件类型进行绕过
3、改后缀大小写绕过,以及收尾加空格,加::$DATA,加点等等
4、黑名单不完整绕过,复习后缀绕过(通过.php5绕过等)
5、压缩包中通过将恶意文件放在子压缩包中绕过
二、中等风险(小型公司可能存在)
1、%00截断(%00只能用于php版本低于5.3的)
2.图片拼接php恶意代码
三、较高风险(现如今的环境部分存在)
1、二次渲染
2、条件竞争
4、数组绕过
一、基础上传漏洞(太过简单目前环境不可能存在)
1、抓包然后改后缀进行绕过
2、抓包然后改上传文件类型进行绕过
3、改后缀大小写绕过,以及收尾加空格,加::$DATA,加点等等
4、黑名单不完整绕过,复习后缀绕过(通过.php5绕过等)
5、压缩包中通过将恶意文件放在子压缩包中绕过
例如:
二、中等风险(小型公司可能存在)
1、%00截断(%00只能用于php版本低于5.3的)
2.图片拼接php恶意代码
可以直接用Notepad直接打开图片后面加一个php代码,但是需要16进制,要不然图片可能出错。
也可以cmd进行生成,命令语句:copy 14.jpg /b + 14.php /a webshell.jpg
三、较高风险(现如今的环境部分存在)
1、二次渲染
imagecreatefromjpeg()函数
二次渲染是由Gif文件或 URL 创建一个新图象。成功则返回一图像标识符/图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败。
进行通关
按照原来的方法进行上传,我们可以发现还是可以上传的,但是配合包含漏洞却无法解析,这时我们把上传的图片复制下来用Notepad打开,发现我们原来写的php代码没有了,这就是二次渲染把我们里面的php代码删掉了。
我们把原图和他修改过的图片进行比较,看看哪个部分没有被修改。将php代码放到没有被更改的部分,配合包含漏洞,就可以了。
2、条件竞争
对条件竞争的考察,我们看代码他是先将图片上传上去,才开始进行判断后缀名、二次渲染。如果我们在上传上去的一瞬间访问这个文件,那他就不能对这个文件删除、二次渲染。这就相当于我们打开了一个文件,然后再去删除这个文件,就会提示这个文件在另一程序中打开无法删除。
操作:直接上传一个php文件,然后进行抓包,将数据包发送至intruder下
然后发包,用另一个浏览器一直访问18.php地址,只要在上传的一瞬间,他还没来的及删除、修改就可以了(一直访问)。
4、数组绕过
源代码:
php
$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
//检查MIME
$allow_type = array('image/jpeg','image/png','image/gif');
if(!in_array($_FILES['upload_file']['type'],$allow_type)){
$msg = "禁止上传该类型文件!";
}else{
//检查文件名
$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
if (!is_array($file)) {
$file = explode('.', strtolower($file));
}
$ext = end($file); //文件后缀
$allow_suffix = array('jpg','png','gif');
if (!in_array($ext, $allow_suffix)) {
$msg = "禁止上传该后缀文件!";
}else{
$file_name = reset($file) . '.' . $file[count($file) - 1];
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' .$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$msg = "文件上传成功!";
$is_upload = true;
} else {
$msg = "文件上传失败!";
}
}
}
}else{
$msg = "请选择要上传的文件!";
}
如果save_name为空,则把`$_FILES['upload_file']['name']`赋值给$file,反之`$_POST['save_name']`赋值给$file
如果$file不是数组,则将其处理为数组,通过`.`符号将其分割 [ “muma.php”,””,”jpg”]
通过`end()`函数获得$file中的最后一个元素,赋值给$ext,并进行后缀校验。感觉这里应该有名堂
后缀符合,则拼接文件名为`首元素.尾元素` `reset()`获取数组首元素
$file_name = reset($file) . '.' . $file[count($file) - 1];
count[2]-1=1,因为[1]我们没有设置就直接为空,前面为返回的file为test.php再拼接一个小数点,又因为windows会省略小数点,即可上传成功