条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。

成因

下面以相关操作逻辑顺序设计的不合理为例,具体讨论一下这类问题的成因。在很多系统中都会包含上传文件或者从远端获取文件保存在服务器的功能(如:允许用户使用网络上的图片作为自己的头像的功能)
程序在线性运行,就是单线程运行时是察觉不到这种条件竞争漏洞的.这种漏洞的最大成因是在高并发状态下,原本合理的程序却出现了超乎预期的问题.

范例

http://202.119.201.199/challenge/web/uploadfile/
第一步:这题很奇怪..只是用利用php的后缀就送了2个flag??怕是神经病
第二步:返回包提示要突破第三层防护.尝试了几个后缀,php3,php5,pht返回包提示上传成功却无法解析再试试phtml,返回包提示变了,上传成功,却被删除了.
第三步:由第二步的提示,可知这是一个条件竞争漏洞,文件成功上传后被删除,要是我们一边不断的发送上传包,一边不断访问,是否就有一定可能性访问到还未来得及删除的文件?而且,文件名并未被重命名,也就是我们发的包不需要改变,利用burp就可以做到了.

这题文件后缀用.pht成功突破上传,给出了相对路径,可是不管怎么访问却跳回到该平台的主页,利用burp和python发包都没达到预期的效果,有点坑,不知道哪一步姿势不对,以后再更吧

http://119.23.73.3:5006/web2/index2.php
这题条件竞争漏洞,上传php文件后给出访问路径,访问后提示slow.那咱就快呗,用python不断访问它给的路径,再用burp不断的上传发包

import requests
    url=’path’
        while(1):
               r=requests.get(url)
               if ‘moctf’ in r.text:
                       print r.text

如果手速够快,用另一个浏览器疯狂F5也行.

Upload-labs pass17也是条件竞争问题,可以学习一下漏洞源码的具体形态
$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 = '上传失败!';
    }
}

问题就在于它先将上传的文件复制到指定的文件夹,再判断是否白名单里的文件类型,不是则用unlink删除.
所以,防御这样的漏洞,就是先判断是否正确的文件类型,再进行复制,利用白名单的过滤,可以避免php文件被上传并执

参考链接:

http://wiki.secbug.net/web_race-condtion.html
    https://blog.csdn.net/u011377996/article/details/79511160
    https://blog.csdn.net/qq_36992198/article/details/80007405