条件竞争漏洞

“竞争条件”是什么?

竞争条件发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。

开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,但他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。

线程同步机制确保两个及以上的并发进程或线程不同时执行某些特定的程序段,也被称之为临界区(critical section),如果没有应用好同步技术则会发生“竞争条件”问题。

条件竞争漏洞其实也就是当同时并发多个线程去做同一件事,导致处理逻辑的代码出错,出现意想不到的结果。

条件竞争漏洞一般出现在与数据库系统频繁交互的位置,例如金额同步、支付等较敏感操作处。另外条件竞争漏洞也会出现在其他位置,例如文件的操作处理等。

例子1:银行提现

假设现有一个用户在系统中共有2000元可以提现,他想全部提现。于是该用户同时发起两次提现请求,第一次提交请求提现2000元,系统已经创建了提现订单但还未来得及修改该用户剩余金额,此时第二次提现请求同样是提现2000元,于是程序在还未修改完上一次请求后的余额前就进行了余额判断,显然如果这里余额判断速度快于上一次余额修改速度,将会产生成功提现的两次订单,而数据库中余额也将变为-2000。而这产生的后果将会是平台多向该用户付出2000元。

例2:先存储文件,再判断是否合法,然后再删除。

首先将文件上传到服务器,然后检测文件后缀名,如果不符合条件,就删掉,典型的“引狼入室”

攻击:首先上传一个php文件
当然这个文件会被立马删掉,所以我们使用多线程并发的访问上传的文件,总会有一次在上传文件到删除文件这个时间段内访问到上传的php文件,一旦我们成功访问到了上传的文件,那么它就会输出结果或者向服务器写一个shell。

作者:帅猪佩奇
链接:https://www.jianshu.com/p/09d0eb938e6a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这是upload-libs上面的一个题,题目代码如下

<?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)){  // 可见先上传再判断
        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);      // unlink() 函数删除文件。
        }
    }else{
        $msg = '上传出错!';
    }
}
?>

这里是先用move_uploaded_file函数将上传文件临时保存,再进行判断,如果不在名单白里则unlink删除,在的话就rename重命名,所以这里存在条件竞争。

我们可以如下进行绕过。

用burp开启两个intruder模块,一个用于疯狂的重复上传,另一个用于疯狂的重复访问。

1:首先,上传1.php文件,抓包,放到intruder模块中
在这里插入图片描述
2:然后访问我们上传文件后的路径,抓包,也放到intruder模块中
在这里插入图片描述
3:设置这两个intruder的payloads,Payload type设置为Null payloads,然后设置访问次数,我这里设置的50000
在这里插入图片描述
4:同时放两个intruder模块,可以看到,访问了50000次,最后只有4次成功了。其他的访问次数里,有小部分是状态码返回200,但执行出错。大部分是返回404
在这里插入图片描述
利用这个方法,我们可以向服务器执行恶意命令、写webshell等等。

参考:

https://blog.csdn.net/qq_36119192/article/details/102944493

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值