对于“条件竞争”的利用

0x01 条件竞争

条件竞争漏洞是一种服务器端的漏洞,是由于开发者设计应用程序并发处理时操作逻辑不合理而造成。当应用面临高并发的请求时未能同步好所有请求,导致请求与请求之间产生等待时出现逻辑缺陷。该漏洞一般出现在与数据库系统频繁交互的位置,例如金额同步、支付等较敏感操作处。另外条件竞争漏洞也会出现在其他位置,例如文件的操作处理等。

0x02 例子1

某平台提现功能的业务处理流程为: 用户发起提现 -> 获取用户金额并判断能否提现 -> 提现:生成提现订单->扣除提现金额

<?php

public funtion withdraw($user_id, $withdrawal_amount){

//获取余额

$money = $db->FirstRow("SELECT * FROM ".Tb('money')." WHERE user_id='{$user_id}'");

 

if($money['balance'] == 0) ShowError('金额为零,无法提现!');

 

//提现余额小于等于数据库的值就提现

if ($withdrawal_amount <= $money['balance']) {

create_withdraw_order($withdrawal_amount, $user_id, time());

$db->Execute("UPDATE ".Tb('money')." SET balance=balance-{$withdrawal_amount} WHERE uer_id='{$user_id}'");

ShowSuccess('提现成功!');

}else{

ShowError('提现金额过高!');

}

}

?>

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

0x03 例子2

先存储文件,再判断是否合法,然后又删除。。。
在这里插入图片描述
首先将文件上传到服务器,然后检测文件后缀名,如果不符合条件,就删掉,典型的“引狼入室”。
具体攻击流程查看,https://baynk.blog.csdn.net/article/details/102910267

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值