Django下的Race Condition漏洞
目录
环境搭建
无锁无事务的竞争攻击复现
无锁有事务的竞争攻击复现
悲观锁进行防御
乐观锁进行防御
环境搭建
首先我们安装源码包:GitHub - phith0n/race-condition-playground: Playground for Race Condition attack
然后将源码包上传到Ubuntu
为了方便使用我们可以对文件进行重命名
解压
unzip race-condition-playground-main.zip
备份env文件
root@utuntu000:~/race-condition# cp .env.default .env.default.bak
root@utuntu000:~/race-condition# mv .env.default .env
修改env文件内容:
原:DEBUG=true //因为这里不对
修改后:DEBUG=True
安装需要的库:
pip3 install -r requirements.txt
注:可以使用豆瓣源来下载,速度更快
生成数据表:migrate:
python3 manage.py migrate
使用python生成前端代码:
python3 manage.py collectstatic
使用python创建用户:
python3 manage.py createsuperuser

运行:
gunicorn -w 2 -k gevent -b 0.0.0.0:8080 race_condition_playground.wsgi
[2023-11-13 16:44:25 +0800] [9072] [INFO] Starting gunicorn 21.2.0
[2023-11-13 16:44:25 +0800] [9072] [INFO] Listening at: http://0.0.0.0:8080 (9072)
[2023-11-13 16:44:25 +0800] [9072] [INFO] Using worker: gevent
[2023-11-13 16:44:25 +0800] [9075] [INFO] Booting worker with pid: 9075
[2023-11-13 16:44:25 +0800] [9076] [INFO] Booting worker with pid: 9076
注:如果没有gunicorn工具,可以使用pip3 linstall 来安装
然后我们就可以尝试访问这个后台

然后我们就可以尝试访问一下admin
我们输入账号密码,成功的登录到了后台页面
我们现在就可以给用户增加一些钱:

然后我们在URL中访问
http://192.168.159.219:8080/ucenter/1/
我们尝试在amount中输入100

这里可以看到我们提交的金额大于所拥有的金额,会直接报错
无锁无事务的竞争攻击复现

我们首先进入到:/root/race-condition/templates
将form表单的提交方式修改为form-data流的形式

输入金额
先使用Burpsuite进行抓包(浏览器开启代理)
点击提交后
赋值内容,然后DROP这个包
关闭代理,再去查看一下金额:发现金额并没有改变
然后打开Yakit软件
点击本地的这个项目->打开项目,或看到这样一个页面
然后就来到了这里,然后将前面抓到的数据粘贴进这里:
POST /ucenter/1/ HTTP/1.1
Host: 192.168.159.219:8000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://192.168.159.219:8000/ucenter/1/
Content-Type: multipart/form-data; boundary=---------------------------366213157039382255462597162624
Content-Length: 366
Origin: http://192.168.159.219:8000
Connection: close
Cookie: __tins__21208037=%7B%22sid%22%3A%201699867069692%2C%20%22vd%22%3A%2011%2C%20%22expires%22%3A%201699870531399%7D; __51cke__=; __51laig__=11; csrftoken=PqAPXKFwTwIlbNyqhrelYxqbWgKPtsKjXdlcwxe3TqCfxT44ecNu3QLFhZWnRiaQ; sessionid=3kx07mweulpr4559s5gyfte6d2whwfna
Upgrade-Insecure-Requests: 1
-----------------------------366213157039382255462597162624
Content-Disposition: form-data; name="amount"
10
-----------------------------366213157039382255462597162624
Content-Disposition: form-data; name="csrfmiddlewaretoken"
2s3TnpbX4HE23G8XhBfoAaoyTXKUklEmafOgWcKu4ByWpMEBemOxFtJ2eGWsIb4T
-----------------------------366213157039382255462597162624--
可以将一些没有用的东西删除掉,删除完成后:
POST /ucenter/1/ HTTP/1.1
Host: 192.168.159.219:8000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Content-Type: multipart/form-data; boundary=---------------------------366213157039382255462597162624
Cookie: __tins__21208037=%7B%22sid%22%3A%201699867069692%2C%20%22vd%22%3A%2011%2C%20%22expires%22%3A%201699870531399%7D; __51cke__=; __51laig__=11; csrftoken=PqAPXKFwTwIlbNyqhrelYxqbWgKPtsKjXdlcwxe3TqCfxT44ecNu3QLFhZWnRiaQ; sessionid=3kx07mweulpr4559s5gyfte6d2whwfna
Upgrade-Insecure-Requests: 1
-----------------------------366213157039382255462597162624
Content-Disposition: form-data; name="amount"
10
-----------------------------366213157039382255462597162624
Content-Disposition: form-data; name="csrfmiddlewaretoken"
2s3TnpbX4HE23G8XhBfoAaoyTXKUklEmafOgWcKu4ByWpMEBemOxFtJ2eGWsIb4T
-----------------------------366213157039382255462597162624--
然后进行并发配置,然后发送
但是这里并没有测试成功,我们删除这条日志:
然后再为yps用户增加10块钱,用于测试
然后我们可以再次测试:
我们可以将重复发包数修改为1000再次尝试,但是还是没有成功(重复以上操作,直到成功)
可以看到,这里转发了两次,我们再看看日志
这里很明显购买了两次,我们只有10块钱,却购买了两次10块钱的东西,这里成功的利用竞争漏洞实现了攻击!
无锁有事务的竞争攻击复现
我们可以在源代码中增加事务(注:本代码中已经有了,不需要手动添加):
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())
然后删除之前的日志,然后为用户增加10元
重新抓包,相同的方法放到Yakit软件中
然后还是一样反复的使用对线程并发的发送请求:(多试试几次)
可以看到,还是出现了多个302跳转,说明事务无法阻止竞争型漏洞 
从日志中也可以看到,成功了!
悲观锁进行防御
代码中的3页面就是使用了悲观锁进行防御
还是像上面一样来测试
这里就只展示多线程访问的结果:
可以看到只有一个302跳转,我们尝试多次也是这个结果,说明成功的访问到了
查看日志也可以看到是正常的:
但是这里还有一个问题就是:悲观锁会把读和写都锁住,性能会收到影响,那么我们就可以使用乐观锁进行防御
乐观锁进行防御
代码中的4页面就是使用了乐观锁进行防御
代码中的3页面就是使用了悲观锁进行防御
还是像上面一样来测试
这里就只展示多线程访问的结果:
这里的结果与悲观锁的结果是差不多的只有一个302跳转,我们尝试多次也是这个结果
乐观锁就是我们结果这个Race Condition漏洞的防御方案了!
但是我们还是要知道的是乐观锁并没有悲观锁安全,但是乐观锁的性能比悲观锁好
相关文章:
Django下的Race Condition漏洞
目录 环境搭建 无锁无事务的竞争攻击复现 无锁有事务的竞争攻击复现 悲观锁进行防御 乐观锁进行防御 环境搭建 首先我们安装源码包:GitHub - phith0n/race-condition-playground: Playground for Race Condition attack 然后将源码包上传到Ubuntu 为了方便使…...
【数据结构】希尔排序(最小增量排序)
👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:数据结构 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有帮助…...
Android Native崩溃信息分析和 工具(addr2line和ndkstack)使用
这里以一个实际的crash案例未demo进行分析和讲解。针对native的崩溃信息。一般来讲,较快的方式是直接检索到backtrace,然后通过分析和使用工具addr2line和 ndk-stack等定位到出问题的地方。这里截取了一段 崩溃日志,具体如下: 01…...
2023年05月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试
Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 明明每天坚持背英语单词,他建立了英语单词错题本文件“mistakes.txt”,将每天记错的单词增加到该文件中,下列打开文件的语句最合适的是?( ) A: f = open(“mistakes.txt”) B: …...
SQLite3 数据库学习(文章链接汇总)
参考引用 SQLite 权威指南(第二版)SQLite3 入门 SQLite3 数据库学习(一):数据库和 SQLite 基础 SQLite3 数据库学习(二):SQLite 中的 SQL 语句详解 SQLite3 数据库学习(三…...
【VSCode】Visual Studio Code 下载与安装教程
前言 Visual Studio Code(简称 VS Code)是一个轻量级的代码编辑器,适用于多种编程语言和开发环境。本文将介绍如何下载和安装 Visual Studio Code。 下载安装包 首先,我们需要从官方网站下载 Visual Studio Code 的安装包。请访…...
分布式教程从0到1【1】分布式基础
1 分布式基础概念 1.1 微服务 微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个小服务运行在自己的进程中,并使用轻量级机制通信,通常是 HTTP API。这些服务围绕业务能力来构建,并通过完全自动化部署…...
Ubuntu22.04 部署Mqtt服务器
1、打开Download EMQX (www.emqx.io)下载mqtt服务器版本 2、Download the EMQX repository curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash 3.Install EMQX sudo apt-get install emqx 4.Run EMQX sudo systemctl start…...
HMM与LTP词性标注之LTP介绍
文章目录 LTP 上图缺点:参数太多,中文语料库匮乏 注意力机制,相当于给每一个词赋予一个权重,权重越大的越重要。 bert的缺点:神经元太多,较慢。 LTP 如果只是需要做词性的识别,那么用LTP就可…...
基于SSM的学生疫情信息管理系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测
分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测 目录 分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据…...
用电子签章软件怎么给标书一键签章的小故事
在这个数字化时代,电子签章已经成为了商务往来的重要一环。作为国内电子签章软件的佼佼者,微签凭借其19年的电子签研发应用经验,为中小企业提供了安全可靠的电子签章软件服务。 从审批场景到合同签署,微签都展现出卓越的电子签章…...
Windows10电脑没有微软商店的解决方法
在Windows10电脑中用户可以打开微软商店,下载自己需要的应用程序。但是,有用户反映自己Windows10电脑上没有微软商店,但是不清楚具体的解决方法,接下来小编给大家详细介绍关于解决Windows10电脑内微软商店不见了的方法,…...
SpringCloud-Gateway修改Response响应体,并解决大数据量返回不全等问题
官网相关案例: Spring Cloud Gatewayhttps://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-modifyresponsebody-gatewayfilter-factory ModifyRequestBodyGatewayFilterFactory类: https://github.com/spring-cloud/spring-cloud-gate…...
Spark与SQL之间NB的转换_withClumn,split及SubString
业务中有这样一个场景,我想实现的是将dataframe表table1中的字段b1与c1的内容使用下划线_连接起来列的名字为d1,比如比如学习_1,睡觉_2,吃饭_3,这是我的第一个需求;随后我想保留的是dataframe表table1中的字段d1中的数据比如学习_…...
修改服务器端Apache默认根目录
目标:修改默认Apache网站根目录 /var/www/html 一、找到 DocumentRoot “/var/www/html” 这一段 apache的根目录,把/var/www/html 这个目录改 #DocumentRoot "/var/www/html" DocumentRoot "/home/cloud/tuya_mini_h5/build" 二、…...
网络安全(大厂面试真题集)
前言 随着国家政策的扶持,网络安全行业也越来越为大众所熟知,想要进入到网络安全行业的人也越来越多。 为了拿到心仪的 Offer 之外,除了学好网络安全知识以外,还要应对好企业的面试。 作为一个安全老鸟,工作这么多年…...
系列五、JVM的内存结构【PC寄存器】
一、位置 CPU中 二、作用 每个线程都有一个程序计数器,是线程私有的,所谓PC寄存器其实就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,也即将要执行的指令代码),由执行引…...
ClickHouse UDF 运行速度慢问题
一、环境版本 环境版本docker clickhouse22.3.10.22 二、UDF运行速度时快时慢 udf配置文件xxx_function.xml type- 可执行类型。如果type设置为executable则启动单个命令。如果设置为,executable_pool则创建命令池。 pool_size- 命令池的大小。可选参数ÿ…...
python科研绘图:面积图
目录 1、面积图 2、堆积面积图 1、面积图 面积图是一种数据可视化图表,用于展示数据随时间或其他有序类别的变化趋势。它与折线图相似,但在展示数据变化的同时,面积图还强调了各个数据点之间的累积关系。这种图表通常通过在折线下方填充颜…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
