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.pswp.cn/web/71826.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71826.shtml
英文地址,請注明出處:http://en.pswp.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;它的核心思想非常巧妙。它把求解模型參數的過程分成…