條件競爭漏洞

2021-10-07 10:01:17 字數 1887 閱讀 5863

競爭條件發生在多個執行緒同時訪問同乙個共享**、變數、檔案等沒有進行鎖操作或者同步操作的場景中。

開發者在進行**開發時常常傾向於認為**會以線性的方式執行,但他們忽視了並行伺服器會併發執行多個執行緒,這就會導致意想不到的結果。

執行緒同步機制確保兩個及以上的併發程序或執行緒不同時執行某些特定的程式段,也被稱之為臨界區(critical section),如果沒有應用好同步技術則會發生「競爭條件」問題。

條件競爭漏洞其實也就是當同時併發多個執行緒去做同一件事,導致處理邏輯的**出錯,出現意想不到的結果。

條件競爭漏洞一般出現在與資料庫系統頻繁互動的位置,例如金額同步、支付等較敏感操作處。另外條件競爭漏洞也會出現在其他位置,例如檔案的操作處理等。

假設現有乙個使用者在系統中共有2000元可以提現,他想全部提現。於是該使用者同時發起兩次提現請求,第一次提交請求提現2000元,系統已經建立了提現訂單但還未來得及修改該使用者剩餘金額,此時第二次提現請求同樣是提現2000元,於是程式在還未修改完上一次請求後的餘額前就進行了餘額判斷,顯然如果這裡餘額判斷速度快於上一次餘額修改速度,將會產生成功提現的兩次訂單,而資料庫中餘額也將變為-2000。而這產生的後果將會是平台多向該使用者付出2000元。

首先將檔案上傳到伺服器,然後檢測檔案字尾名,如果不符合條件,就刪掉,典型的「引狼入室」

攻擊:首先上傳乙個php檔案

當然這個檔案會被立馬刪掉,所以我們使用多執行緒併發的訪問上傳的檔案,總會有一次在上傳檔案到刪除檔案這個時間段內訪問到上傳的php檔案,一旦我們成功訪問到了上傳的檔案,那麼它就會輸出結果或者向伺服器寫乙個shell。

這是upload-libs上面的乙個題,題目**如下

<?php 

$is_upload

=false

;$msg

=null;if

(isset

($_post

['submit'])

)else

}else

}?>

這裡是先用move_uploaded_file函式將上傳檔案臨時儲存,再進行判斷,如果不在名單白裡則unlink刪除,在的話就rename重新命名,所以這裡存在條件競爭。

我們可以如下進行繞過。

用burp開啟兩個intruder模組,乙個用於瘋狂的重複上傳,另乙個用於瘋狂的重複訪問。

1:首先,上傳1.php檔案,抓包,放到intruder模組中

2:然後訪問我們上傳檔案後的路徑,抓包,也放到intruder模組中

3:設定這兩個intruder的payloads,payload type設定為null payloads,然後設定訪問次數,我這裡設定的50000

4:同時放兩個intruder模組,可以看到,訪問了50000次,最後只有4次成功了。其他的訪問次數裡,有小部分是狀態碼返回200,但執行出錯。大部分是返回404

利用這個方法,我們可以向伺服器執行惡意命令、寫webshell等等。

參考:

競爭條件漏洞

當乙個程式的兩個併發執行緒同時訪問共享資源時,如果執行時間和順序不同,會對結果產生影響,這時就稱作發生了競爭條件。髒牛靜態條件漏洞 它允許攻擊者修改任何可讀但不可寫的檔案,攻擊者可以通過該漏洞獲取root許可權,該漏洞還影響了基於linux核心的安全系統。熔斷和幽靈漏洞 導致使用者讀取到它們本來讀不...

競爭條件(race condition)

在一些作業系統中,協作的程序可能共享一些彼此都能讀寫的公用儲存區。這個公用儲存區可能在記憶體中 可能是在核心資料結構中 也可能是乙個共享檔案。這裡共享儲存區的位置並不影響通訊的本質及其帶來的問題。為了理解實際中程序間通訊如何工作,我們考慮乙個簡單但很普遍的例子 乙個假離線列印程式。當乙個程序需要列印...

Web條件競爭

最近,正好作業系統課上正在學程序的競爭關係,再加上寒假安恆杯2月賽上有道web題考到了條件競爭漏洞的利用,所以就系統的學習和總結下條件競爭漏洞。一 漏洞成因 執行緒程式設計中,為了保證資料操作的一致性,作業系統引入了鎖機制,用於保證臨界區 的安全。通過鎖機制,能夠保證在多核多執行緒環境中,在某乙個時...