django下防御race condition漏洞(竞争型漏洞)

目录

竞争型漏洞

概念

常见类型及示例

环境搭建

​编辑漏洞复现

ucenter/1/

ucenter/2/

ucenter/3/

ucenter/4/

总结

悲观锁

乐观锁


竞争型漏洞

概念

竞争型漏洞,也称为竞态条件漏洞(Race Condition Vulnerability),是由于程序在处理共享资源时,未能正确同步多个并发操作,导致执行结果依赖于这些操作的时序,从而可能被攻击者利用的安全漏洞。

假设有一个银行应用,处理转账的时候,如果两个转账操作同时进行,而余额检查没有正确同步,可能导致余额错误地被处理。例如,用户A有100元,同时发起两笔转账,各转出100元,如果系统没有正确锁定资源,可能两笔转账都通过,导致用户A的余额变成负数,这就是竞争条件导致的漏洞。

常见类型及示例

  1. TOCTOU(Time-of-Check to Time-of-Use)

    • 原理:程序在检查资源状态后、使用资源前,攻击者篡改资源。

    • 示例:检查文件权限后,攻击者替换为恶意文件,导致高权限执行。

    • 场景:文件系统操作、权限验证。

  2. 资源争用

    • 原理:并发操作修改同一资源(如余额、库存)时未同步。

    • 示例:电商系统中,两用户同时购买最后一件商品,导致超卖。

    • 场景:金融交易、库存管理。

  3. 异步操作漏洞

    • 原理:回调或事件处理顺序不当引发状态混乱。

    • 示例:JavaScript中多个异步回调修改同一变量,导致数据错误。

    • 场景:前端应用、分布式任务处理。

下面介绍一个关于竞争性的漏洞

环境搭建

可以在资源中下载文件解压

将文件上传到linux下,我们修改文件按中的错误,

将.env.defaul修改为.env

修改文件中的DEBUG=True

然后进行如下操作

pip3 install -r requirements.txt python3 manage.py migratepython3 manage.py collectstaticpython3 manage.py createsuperuserpython3 manage.py runserver  0.0.0.0:8080

完成之后可以访问网站

漏洞复现

ucenter/1/

无锁无事务时的竞争攻击

class WithdrawView1(BaseWithdrawView):success_url = reverse_lazy('ucenter:withdraw1')def form_valid(self, form):amount = form.cleaned_data['amount']self.request.user.money -= amountself.request.user.save()models.WithdrawLog.objects.create(user=self.request.user, amount=amount)return redirect(self.get_success_url())

利用bp抓包,当出现两次以上的扣款成功,就说明漏洞利用成功

竞争成功

查看日志 

ucenter/2/

无锁有事务时的竞争攻击

class WithdrawView2(BaseWithdrawView):success_url = reverse_lazy('ucenter:withdraw2')@transaction.atomicdef form_valid(self, form):amount = form.cleaned_data['amount']self.request.user.money -= amountself.request.user.save()models.WithdrawLog.objects.create(user=self.request.user, amount=amount)return redirect(self.get_success_url())

继续竞争

 查看日志

竞争成功。

ucenter/3/

悲观锁加事务防御Race Condition

class WithdrawView3(BaseWithdrawView):success_url = reverse_lazy('ucenter:withdraw3')def get_form_kwargs(self):kwargs = super().get_form_kwargs()kwargs['user'] = self.userreturn kwargs@transaction.atomicdef dispatch(self, request, *args, **kwargs):self.user = get_object_or_404(models.User.objects.select_for_update().all(), pk=self.request.user.pk)return super().dispatch(request, *args, **kwargs)def form_valid(self, form):amount = form.cleaned_data['amount']self.user.money -= amountself.user.save()models.WithdrawLog.objects.create(user=self.user, amount=amount)return redirect(self.get_success_url())

 发现只有一次提款成功

ucenter/4/

乐观锁加事务防御Race Condition

class WithdrawView4(BaseWithdrawView):success_url = reverse_lazy('ucenter:withdraw4')@transaction.atomicdef form_valid(self, form):amount = form.cleaned_data['amount']rows = models.User.objects.filter(pk=self.request.user, money__gte=amount).update(money=F('money')-amount)if rows > 0:models.WithdrawLog.objects.create(user=self.request.user, amount=amount)return redirect(self.get_success_url())

发现也只有一次成功

总结

悲观锁

概念

  • 悲观锁假设并发冲突一定会发生,因此在访问数据时直接加锁,确保其他事务无法修改数据,直到当前事务完成。

  • 悲观锁通常通过数据库的锁机制实现,如 SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE

特点

  • 优点:保证数据的一致性,适合写操作多的场景。

  • 缺点:加锁会降低并发性能,可能导致死锁。

使用场景

  • 高并发写操作。

  • 数据一致性要求高的场景。

实例

该例子需要实现一个转账操作,确保余额不会出现负数。

SELECT ... FOR UPDATE 中,账户A的记录被锁定,其他事务无法修改,直到当前事务提交或回滚。

-- 开启事务
START TRANSACTION;-- 使用悲观锁锁定账户A的记录
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;-- 检查余额是否足够
IF (SELECT balance FROM accounts WHERE id = 1) >= 100 THEN-- 扣除账户A的余额UPDATE accounts SET balance = balance - 100 WHERE id = 1;-- 增加账户B的余额UPDATE accounts SET balance = balance + 100 WHERE id = 2;
END IF;-- 提交事务
COMMIT;

乐观锁

概念

  • 乐观锁假设并发冲突很少发生,因此在访问数据时不加锁,而是在提交时检查数据是否被其他事务修改过。

  • 乐观锁通常通过版本号(Version)或时间戳(Timestamp)实现。

特点

  • 优点:提高并发性能,适合读操作多的场景。

  • 缺点:如果冲突频繁,会导致大量事务回滚。

使用场景

  • 高并发读操作。

  • 冲突较少的场景。

实例

在乐观锁中,通过 version 字段检查数据是否被修改。如果 version 不匹配,说明数据已被其他事务修改,当前事务需要回滚并重试。

即,当用户A进行提款操作时,若存在两个以上的请求进程(查询的version为1),当某一个进程率先请求成功,version会自增1,其他的进程就无法查询到该版本号,从而不会执行账户操作,事务回滚。

-- 开启事务
START TRANSACTION;-- 查询账户A的余额和版本号
SELECT balance, version FROM accounts WHERE id = 1;-- 假设查询到的 balance = 500, version = 1
-- 检查余额是否足够
IF 500 >= 100 THEN-- 扣除账户A的余额,并更新版本号UPDATE accounts SET balance = balance - 100, version = version + 1 WHERE id = 1 AND version = 1;-- 检查是否更新成功IF ROW_COUNT() = 0 THEN-- 版本号不匹配,说明数据已被其他事务修改,回滚事务ROLLBACK;ELSE-- 增加账户B的余额UPDATE accounts SET balance = balance + 100 WHERE id = 2;-- 提交事务COMMIT;END IF;
END IF;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/71826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Python写一个算24点的小程序

一、运行界面 二、显示答案——递归介绍 工作流程&#xff1a; 1. 基本情况&#xff1a;函数首先检查输入的数字列表 nums 的长度。如果列表中只剩下一个数字&#xff0c;它会判断这个数字是否接近 24&#xff08;使用 abs(nums[0] - 24) < 1e-10 来处理浮点数精度问题&…

PostgreSQL 18新特性之虚拟生成列

PostgreSQL 12 提供了生成列&#xff08;GENERATED ALWAYS AS STORED&#xff09;功能&#xff0c;但是只能支持存储型的生成列&#xff0c;需要占用存储空间&#xff0c;更新成本高。 为此&#xff0c;PostgreSQL 18 即将引入一个新的增强&#xff1a;虚拟生成列。这种类型的…

GitHub上传项目

总结&#xff08;有基础的话直接执行这几步&#xff0c;就不需要再往下看了&#xff09;&#xff1a; git init 修改git的config文件&#xff1a;添加:[user]:name你的github用户名 email你注册github的用户名 git branch -m master main git remote add origin 你的URL gi…

常见排序算法深度评测:从原理到10万级数据实战

常见排序算法深度评测&#xff1a;从原理到10万级数据实战 摘要 本文系统解析冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序和基数排序8种经典算法&#xff0c;通过C语言实现10万随机数排序并统计耗时。测试显示&#xff1a;快速排序综合性能最优&…

动态规划填表技巧:固定最后一个数 vs 固定倒数第二个数

在动态规划中&#xff0c;填表时固定最后一个数还是倒数第二个数&#xff0c;取决于问题的定义和状态转移方程的设计。 目录 1. 固定最后一个数 适用场景 特点 示例 2. 固定倒数第二个数 适用场景 特点 示例 3. 固定最后一个数与倒数第二个数的对比 4. 总结 1. 固定最…

【C】链式二叉树算法题2

目录 1 另一棵树的子树 1&#xff09; 题目描述 示例1&#xff1a; 示例2&#xff1a; 2&#xff09; 算法解析 3&#xff09; 代码 2 二叉树的遍历 1&#xff09; 问题描述 2&#xff09; 算法解析 3&#xff09; 代码 3 总结 1 另一棵树的子树 leetcode链接…

配置Hadoop集群

Hadoop的运行模式 本地运行&#xff1a;在一台单机上运行&#xff0c;没有分布式文件系统&#xff0c;直接读写本地操作系统的文件系统。特点&#xff1a;不对配置文件进行修改&#xff0c;Hadoop 不会启动 伪分布式&#xff1a;也是在一台单机上运行&#xff0c;但用不同的 …

python办公自动化--数据可视化(pandas+matplotlib)--生成条形图和饼状图

前言 前几天我们学习了pandas读取数据&#xff0c;还学习了如何用patplotlib绘制柱状图和折线图。 今天我们继续学习&#xff0c;如何绘制条形图和饼状图。 一、课程回顾-pandas读取数据 1.示例数据文件 这里我们用到的依旧是d盘底下的这个excel工作簿&#xff0c;这个工作簿…

基于大模型的结节性甲状腺肿诊疗全流程预测与方案研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究意义 1.3 国内外研究现状 二、大模型预测原理与方法 2.1 相关大模型概述 2.2 数据收集与预处理 2.3 模型训练与验证 三、术前预测与评估 3.1 结节性质预测 3.1.1 良恶性判断 3.1.2 与传统诊断方法对比 3.2 手术风险预测…

不同开发语言对字符串的操作

一、字符串的访问 Objective-C: 使用 characterAtIndex: 方法访问字符。 NSString *str "Hello, World!"; unichar character [str characterAtIndex:0]; // 访问第一个字符 H NSLog("%C", character); // 输出: H NSString 内部存储的是 UTF-16 编…

Java开发者如何接入并使用DeepSeek

目录 一、准备工作 二、添加DeepSeek SDK依赖 三、初始化DeepSeek客户端 四、数据上传与查询 五、数据处理与分析 六、实际应用案例 七、总结 【博主推荐】&#xff1a;最近发现了一个超棒的人工智能学习网站&#xff0c;内容通俗易懂&#xff0c;风格风趣幽默&#xff…

S19文件格式详解:汽车ECU软件升级中的核心镜像格式

文章目录 引言一、S19文件格式的起源与概述二、S19文件的核心结构三、S19在汽车ECU升级中的应用场景四、S19与其他格式的对比五、S19文件实例解析六、工具链支持与安全考量七、未来趋势与挑战结语引言 在汽车电子控制单元(ECU)的软件升级过程中,S19文件(也称为Motorola S-…

CTF杂项——[suctf 2019]签到题

base64转图片 可以直接用随波逐流 得到flag SUCTF{ffffffffT4nk}

【Python】整数除法不正确,少1的问题,以及有关浮点数转换的精度问题

1. 问题 今天在做leetcode 不同路径 的时候发现了个问题 对于m53 n4class Solution:def uniquePaths(self, m: int, n: int) -> int:rlt 1for i in range(0, m-1):rlt * (m n - 2 - i)for i in range(0, m-1):rlt / (i 1)return int(rlt)为什么这个结果是 26234class S…

AI无代码平台

以下是目前支持快速开发产品的高生产力免费AI无代码平台推荐&#xff0c;按功能和适用场景分类&#xff1a; 一、全栈应用开发类 Bolt.DIY DeepSeek-R1 无需编写代码即可开发全栈应用&#xff0c;提供免费API和无速率限制&#xff0c;支持AI编码助手与自动化流程 。 优势&…

Gini系数的应用 - 指标波动贡献分析

基尼系数的定义 基尼系数是衡量数据分布不均衡程度的指标&#xff0c;取值范围在0到1之间&#xff1a; 0 表示完全均衡&#xff08;所有值相等&#xff09;。1 表示完全不均衡&#xff08;所有值集中在一个点&#xff09;。 基尼系数的计算公式 假设有 n n n 个数据点&…

第一节: 网络基础与参考模型

深入理解OSI七层模型与TCP/IP四层模型:网络工程师的入门指南 在网络通信的世界中,OSI七层模型和TCP/IP四层模型是理解网络架构的基础。无论是配置路由器、排查网络故障,还是设计复杂的网络系统,掌握这些模型的分层结构及其功能都是必不可少的。本文将从新手角度出发,深入…

HTTP拾技杂谈

HTTP拾技杂谈 简单聊聊HTTP中的那些东西 文章目录 HTTP拾技杂谈前言HTTP协议1.请求从客户端到服务器端的4个步骤一般客户端请求如下&#xff1a;服务端响应如下 2.Keep-AliveHTTP方法Cookie 总结 前言 超文本传输协议&#xff08;Hypertext Transfer Protocol &#xff0c;HT…

用Deepseek写一个五子棋微信小程序

在当今快节奏的生活中&#xff0c;休闲小游戏成为了许多人放松心情的好选择。五子棋作为一款经典的策略游戏&#xff0c;不仅规则简单&#xff0c;还能锻炼思维。最近&#xff0c;我借助 DeepSeek 的帮助&#xff0c;开发了一款五子棋微信小程序。在这篇文章中&#xff0c;我将…

自然语言处理:最大期望值算法

介绍 大家好&#xff0c;博主又来给大家分享知识了&#xff0c;今天给大家分享的内容是自然语言处理中的最大期望值算法。那么什么是最大期望值算法呢&#xff1f; 最大期望值算法&#xff0c;英文简称为EM算法&#xff0c;它的核心思想非常巧妙。它把求解模型参数的过程分成…