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、面积图 面积图是一种数据可视化图表,用于展示数据随时间或其他有序类别的变化趋势。它与折线图相似,但在展示数据变化的同时,面积图还强调了各个数据点之间的累积关系。这种图表通常通过在折线下方填充颜…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
