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