当前位置: 首页 > news >正文

Django下防御Race Condition

目录

漏洞原因

环境搭建

复现

A.无锁无事务时的竞争攻击

B.无锁有事务时的竞争攻击 

防御

A.悲观锁加事务防御

B.乐观锁加事务防御

总结


漏洞原因

Race Condition 发生在多个执行实体(如线程、进程)同时访问共享资源时,由于执行顺序的不确定性,导致程序的最终行为依赖于这些实体的执行时序。如果程序逻辑未正确处理这种并发访问,就会产生意外的结果。

环境搭建

从github上下载源码GitHub - phith0n/race-condition-playground: Playground for Race Condition attack

然后拖到虚拟机上解压

unzip race-condition-playground-main.zip

之后重命名并修改.env.default文件

root@sxc-ubuntu:~/race-condition-playground-main# mv .env.default .env

 

安装依赖的库

pip3 install -r requirements.txt 依赖库python3 manage.py migrate 生成数据表python3 manage.py collectstatic 生成前端代码python3 manage.py createsuperuser 添加用户python3 manage.py runserver  0.0.0.0:8080 启动

 最后还要修改一下templates目录下的form.html,将form表单的提交方式修改为form-data流

复现

A.无锁无事务时的竞争攻击

class WithdrawView1(BaseWithdrawView):success_url = reverse_lazy('ucenter:withdraw1')//form表单验证//已经通过验证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())

整个操作没有使用事务,也没有加锁,理论上存在Race Condition漏洞。

1.登录后台

http://192.168.217.128:8080/admin

2.在user模块添加Money

3.进入ucenter提现页面

http://192.168.217.128:8080/ucenter/1/

 

 4.点击提交使用burp抓包,发送到repeater模块。(注意,要将拦截到的包drop掉,不然10块钱直接没了,没法测试了)。然后将包内容复制到Yakit上的WebFuzzer下的request里面,并设置好重复发包数和并行线程数。

 5.点击发送请求,我们会在request模块右边,看到响应结果,很幸运一次就成功了

在前端页面的withdrow logs模块也看到了日志信息

竞争成功 

B.无锁有事务时的竞争攻击 

新编写一个`WithdrawView2`,加上`@transaction.atomic`修饰符:成功则成功,失败则回滚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())

同样使用Yakit测试

 

发现结果并没有什么区别

防御

A.悲观锁加事务防御

 Django在ORM里提供了对数据库Select for Update的支持,结合Where语句,可以实现行级的锁。 使用SELECT FOR UPDATE获取到的数据库记录,不会再被其他事务获取。

这样就可以保证我们在同一个事务内执行的操作的原子性,这是一个典型的悲观锁

“悲观锁”的意思是,我们先假设其他线程会修改数据,所以在操作数据库前就加锁,直到当前线程释放锁后,其他线程才能再次获取这个锁。

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

我们使用`select_for_update()`来实现一个`WithdrawView3`: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())

对于当前这个场景,我们再次尝试使用Yakit进行竞争攻击:

 可见,此时返回包只有一个302响应了, 这意味着程序是按照预期运行,没有发生Race Condition问题。

B.乐观锁加事务防御

我们观察上述的WithdrawView3代码,其实会发现一个问题,如果有大量读操作的场景下,使用悲观锁会有性能问题。因为每次访问这个view都会锁住当前用户对象,此时其他要使用这个用户的场景(如查看用户主页)也会卡住。

另外,也不是所有数据库都支持select for update,我们也可以尝试使用乐观锁来解决Race Condition的问题。

乐观锁的意思就是,我们不假设其他进程会修改数据,所以不加锁,而是到需要更新数据的时候,再使用数据库自身的UPDATE操作来更新数据库。因为UPDATE语句本身是原子操作,所以也可以用来防御并发问题。

我们新增一个`WithdrawView4`: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())

 使用Yakit进行测试,只有一次302返回:

乐观锁的优点就是不会锁住数据库记录,也就不会影响其他线程查询该用户。

总结

悲观锁乐观锁 是两种常见的并发控制机制,用于解决多个事务同时访问和修改同一数据时可能引发的冲突问题。它们的核心区别在于对并发冲突的处理方式。

相关文章:

Django下防御Race Condition

目录 漏洞原因 环境搭建 复现 A.无锁无事务时的竞争攻击 B.无锁有事务时的竞争攻击 防御 A.悲观锁加事务防御 B.乐观锁加事务防御 总结 漏洞原因 Race Condition 发生在多个执行实体(如线程、进程)同时访问共享资源时,由于执行顺序…...

Vue 项目中,.env文件怎么用?

在 Vue 项目中,.env 文件用于存储环境变量,不同的环境(如开发环境、测试环境、生产环境)可以使用不同的 .env 文件来管理对应的配置信息。以下是关于 Vue 项目中 .env 文件的详细使用方法: 1. 项目创建 确保你已经使…...

LeetCode hot 100—爬楼梯

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例…...

【js逆向】

地址:aHR0cHM6Ly93d3cud2VpYm90b3AuY24vMi4wLw f12进入 debugger,过debugger 查看预览数据 全局搜索 请求网址中的 api.weibotop.cn 在下方疑似找到了加密和解密的函数 断点调试 控制台输出 那个n就是 常见的 cryptoJs库 const cryptoJs require(cry…...

论文阅读-秦汉时期北方边疆组织的空间互动模式与直道的定位(中国)

论文英文题目:A spatial interaction model of Qin-Han Dynasty organisation on the northern frontier and the location of the Zhidao highway (China) 发表于:journal of archaeological science,影响因子:3.030 论文主要是…...

DirectX12(D3D12)基础教程四 入门指南

本章主要讲了些D3D12概念和理论,对第一、二章相关概念的补充和纠正,要的理解D3D12概念和理论基础,结合代码加深理解。 命令队列和命令列表 为了实现渲染工作的重用和多线程缩放, 在 D3D12 中,做了三个重要方面不同于 …...

C语言:确定进制

题目&#xff1a; 6942对于十进制来说是错误的&#xff0c;但是对于13进制来说是正确的。即, 6(13) 9(13) 42(13)&#xff0c; 而 42(13)4131213054(10)。 任务是写一段程序&#xff0c;读入三个整数p、q和 r&#xff0c;然后确定一个进制 B(2<B<40) 使得 p q r。 如果…...

如何在 Windows 10 启用卓越性能模式及不同电源计划对比

在使用 powercfg -duplicatescheme 命令启用 “卓越性能模式”&#xff08;即 Ultimate Performance 模式&#xff09;之前&#xff0c;有几个前提条件需要注意&#xff1a; 前提条件&#xff1a; 系统版本要求&#xff1a;卓越性能模式 仅在 Windows 10 专业版 或更高版本&a…...

Unity Android出包

Unity Android出包 1.Android Studio版本 不能高于Unity的版本 2.so库 这个库需要自己拷贝到Android工程当中 3.JDK版本太老 编译可以正常&#xff0c;但无法运行 File->ProjectStructure->SDK Location->Gradle Setting->Gradle JDK->X:/Android Stuido/jre …...

Day04 模拟原生开发app过程 Androidstudio+逍遥模拟器

1、用Androidstudio打开已经写好了的music项目 2、逍遥模拟器打开apk后缀文件 3、在源文件搜索关键字 以后的测试中做资产收集...

2025人工智能AI新突破:PINN内嵌物理神经网络火了

最近在淘金的时候发现基于物理信息的神经网络&#xff08;简称PINN&#xff09;也是个研究热点&#xff0c;遂研读了几篇经典论文&#xff0c;深觉这也是个好发论文的方向&#xff0c;所以火速整理了一些个人认为很值得一读的PINN论文和同学们分享。 为了方面同学们更好地理解…...

通义万相 2.1 携手蓝耘云平台:开启影视广告创意新纪元

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

【计算机网络】深入解析 HTTP 请求中的 header 类型:Cookie 的概念、特点和应用场景:登录和用户认证

网络原理— HTTP 请求“报头”(header) Cookie 是什么 HTTP报头中的Cookie&#xff0c;用大白话来说&#xff0c;就像你去餐厅吃饭时拿到的一张会员卡&#xff1a; 初次访问 (清除该网站的所有 Cookie 后重新访问该网站&#xff0c;效果相同)&#xff1a; 当你第一次访问一个网…...

LeetCode 解题思路 11(Hot 100)

解题思路&#xff1a; 若相等&#xff1a; 直接返回 true。若当前元素大于目标值&#xff1a; 由于列递增&#xff0c;当前列下方所有元素均大于目标值&#xff0c;故排除该列&#xff08;向左移动&#xff09;。若当前元素小于目标值&#xff1a; 由于行递增&#xff0c;当前…...

警惕AI神话破灭:深度解析大模型缺陷与禁用场景指南

摘要 当前AI大模型虽展现强大能力&#xff0c;但其本质缺陷可能引发系统性风险。本文从认知鸿沟、数据困境、伦理雷区、技术瓶颈四大维度剖析大模型局限性&#xff0c;揭示医疗诊断、法律决策等8类禁用场景&#xff0c;提出可信AI建设框架与用户防护策略。通过理论分析与实操案…...

文件系统调用(上) ─── linux第17课

目录 linux 中man 2和man 3的区别 文件内容介绍 C语言文件接口 示例: 输出信息到显示器&#xff0c;你有哪些方法 总结: 系统文件I/O 文件类的系统调用接口介绍 示例 open 函数具体使用哪个,和具体应用场景相关&#xff0c; write read close lseek ,类比C文件相关接…...

go 标准库包学习笔记

本博文包含了go的math&#xff0c;net/http&#xff0c;fmt,io,csv&#xff0c;time.Time,strconv,strings,sync.Pool的学习,笔记多是其实战如何用&#xff0c;而非简单的函数式的讲解&#xff0c;可谓是收藏佳作&#xff0c;不时翻翻。 文章目录 1、math2、net/http3、fmt4、…...

Unity摄像机跟随物体

功能描述 实现摄像机跟随物体&#xff0c;并使物体始终保持在画面中心位置。 实现步骤 创建脚本&#xff1a;在Unity中创建一个新的C#脚本&#xff0c;命名为CameraFollow。 代码如下&#xff1a; using UnityEngine;public class CameraFollow : MonoBehaviour {public Tran…...

线程管理操作

1.创建两个线程&#xff0c;&#xff0c;分支线程1拷贝文件的前一部分&#xff0c;分支线程2拷贝文件的后一部分 #include <head.h>#define SRC_FILE "./1.txt" #define DST_FILE "./2.txt" #define BUFFER_SIZE 4096struct copy_args {long start;l…...

VSCode 2025最新前端开发必备插件推荐汇总(提效指南)

&#x1f31f;前言: 如果你是一名前端开发工程师&#xff0c;合适的开发工具能大大提高工作效率。Visual Studio Code (VSCode) 凭借其轻量级、高扩展性的特点&#xff0c;已成为众多前端开发者在win系电脑的首选IDE。 名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。—…...

docker不停机部署

背景 最近做大疆项目时&#xff0c;后台更新部署时&#xff0c;机场和无人机就会掉线。设备自动重连注册时间比较长&#xff0c;应用长时间不可用。所以需要灰色发布服务。docker-compose的swarm模式可解决此问题。 服务构建脚本Dockerfile # 使用官方Java基础镜像&#xff…...

鸿蒙应用开发—数据持久化之SQLite

文章目录 SQLite简介创建数据库添加数据查询数据更新数据删除数据升级数据库使用事务参考 SQLite简介 SQLite是一个轻量级关系数据库&#xff0c;占用资源很少&#xff0c;只有几百KB的大小&#xff0c;无需服务器支撑&#xff0c;是一个零配置、事务性的SQL数据库引擎。 相对…...

JSON对象处理工具类

目录 1. 工具类的功能设计 2. 工具类的实现 依赖配置 工具类代码 3. 工具类的使用示例 示例1&#xff1a;美化JSON打印 示例2&#xff1a;从JSON中提取数据 示例3&#xff1a;修改JSON数据 示例4&#xff1a;合并JSON对象 4. 总结 在现代软件开发中&#xff0c;JSON&…...

通义万相 2.1 + 蓝耘算力,AI 视频生成的梦幻组合

在这个科技日新月异的时代&#xff0c;人工智能不断刷新着我们对世界的认知。一次偶然的机会&#xff0c;我借助北京蓝耘科技股份有限公司提供的算力支持&#xff0c;踏上了使用通义万相 2.1 进行 AI 视频生成的奇妙之旅。 目录 1.1初遇蓝耘科技&#xff1a; 1.2通义万相 2.1…...

汽车一键启动按钮更换注意事项

汽车一键启动开关更换教程 一键启动开关是现代汽车中常见的便捷配置&#xff0c;但随着时间的推移&#xff0c;这个部件可能会出现失灵的情况。当一键启动开关发生故障时&#xff0c;许多车主选择自行更换。以下是整理的一键启动开关更换教程&#xff1a; 更换前的准备 选择匹…...

AI系统架构

在AI系统架构中&#xff0c;通常可以分为基础设施层、模型层和应用层。它们分别对应不同的技术和应用场景&#xff0c;具体如下&#xff1a; 1. 基础设施层&#xff08;Infrastructure Layer&#xff09; 这是AI系统的底层支持&#xff0c;主要涉及计算资源、存储、网络等基础…...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_01基础固定表头示例

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_01基础固定表头…...

spring boot3.4.3+MybatisPlus3.5.5+swagger-ui2.7.0

使用 MyBatis-Plus 操作 books 表。我们将实现以下功能&#xff1a; 创建实体类 Book。 创建 Mapper 接口 BookMapper。 创建 Service 层 BookService 和 BookServiceImpl。 创建 Controller 层 BookController。 配置 MyBatis-Plus 和数据库连接。 1. 项目结构 src ├─…...

解决CentOS 8.5被恶意扫描的问题

CentOS 8 官方仓库已停止维护(EOL),导致一些常用依赖包如fail2ban 无法正常安装。 完整解决方案: 一、问题根源 CentOS 8 官方仓库已停更:2021 年底 CentOS 8 停止维护,默认仓库的包可能无法满足依赖关系。EPEL 仓库兼容性:EPEL 仓库可能未适配 CentOS 8.5 的旧版本依赖…...

laravel中 添加公共/通用 方法/函数

一&#xff0c;现在app 下面创建Common目录&#xff0c;然后在创建Common.php 文件 二&#xff0c;修改composer.json文件 添加这个到autoload 中 "files": ["app/Common/Common.php"]"autoload": {"psr-4": {"App\\": &quo…...