实验室:通过竞争条件上传 Web shell

前言:
条件竞争漏洞是一种服务器端的漏洞,是由于开发者设计应用程序并发处理时操作逻辑不合理而造成。当应用面临高并发的请求时未能同步好所有请求,导致请求与请求之间产生等待时出现逻辑缺陷。
在这里插入图片描述
2.典型的代码(“引狼入室”)

$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)){
        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 = '上传出错!';
    }
}

这段代码的思路:当服务器接收到上传文件请求后,保存为临时文件,将它存入系统,然后再对其进行判定是否符合白名单要求,若符合要求则进行重命名移动,若不符合则再将该文件删除。

3.条件竞争,“竞争”二字就体现出来了,因为我们上传的文件,它是在文件目录里存在过的,但是不符合要求被删除掉了,中间有段时间是服务器检测文件是否符合要求的时间,我们可以利用这一段时间,赶在上传的恶意文件被删除之前就要访问到它。这就需要发送大量的并发请求。


实验演示:
第一步:上传一个.php类型文件,发现被禁止,提示我们只能上传图片类型的文件。
在这里插入图片描述
第二步:在上传一个10.jpg文件,利用它的GET请求修改文件名后,不断向服务器发送请求。找到99.php的 POST /my-account/avatar 文件上传的请求,将两者发送到 Intruder。
1.POST /my-account/avatar,设置过滤器查找到这个请求,发送到Intruder
在这里插入图片描述
这里选择“无负载”,让它一直发送。请求引擎里线程数我设置的是10.
在这里插入图片描述
2.GET /files/avatars/10.jpg,修改文件名为99.php,设置同上的有效载荷
在这里插入图片描述
在这里插入图片描述
第三步:然后点“开始攻击”,注意GET请求里的“200”响应.
在这里插入图片描述
在这里插入图片描述
这里在文件99.php被删除之前,利用GET请求不断访问,使得我们预期输入的语句被执行,并且返回结果给我们
在这里插入图片描述
将密码提交,实验完成!
在这里插入图片描述


如何防止文件上传漏洞

  • 根据允许扩展名的白名单而不是禁止扩展名的黑名单检查文件扩展名。
  • 确保文件名不包含任何可能被解释为目录或遍历序列 ( …/) 的子字符串。
  • 重命名上传的文件以避免可能导致现有文件被覆盖的冲突。
  • 在完全验证之前不要将文件上传到服务器的永久文件系统。
  • 尽可能使用已建立的框架来预处理文件上传,而不是尝试编写自己的验证机制。

文中可能有的地方说的不对,还希望各位大佬多多保函,给予改正,万分感谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值