条件竞争
“競爭條件”是什么?
競爭條件發生在多個線程同時訪問同一個共享代碼、變量、文件等沒有進行鎖操作或者同步操作的場景中。
開發者在進行代碼開發時常常傾向于認為代碼會以線性的方式執行,但他們忽視了并行服務器會并發執行多個線程,這就會導致意想不到的結果。
線程同步機制確保兩個及以上的并發進程或線程不同時執行某些特定的程序段,也被稱之為臨界區(critical section),如果沒有應用好同步技術則會發生“競爭條件”問題。
條件競爭漏洞其實也就是當同時并發多個線程去做同一件事,導致處理邏輯的代碼出錯,出現意想不到的結果。
條件競爭漏洞一般出現在與數據庫系統頻繁交互的位置,例如金額同步、支付等較敏感操作處。另外條件競爭漏洞也會出現在其他位置,例如文件的操作處理等。
例子1:銀行提現
假設現有一個用戶在系統中共有2000元可以提現,他想全部提現。于是該用戶同時發起兩次提現請求,第一次提交請求提現2000元,系統已經創建了提現訂單但還未來得及修改該用戶剩余金額,此時第二次提現請求同樣是提現2000元,于是程序在還未修改完上一次請求后的余額前就進行了余額判斷,顯然如果這里余額判斷速度快于上一次余額修改速度,將會產生成功提現的兩次訂單,而數據庫中余額也將變為-2000。而這產生的后果將會是平臺多向該用戶付出2000元。
實例:
這是upload-libs上面的一個題,題目代碼如下
這里是先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
參考文章:測試Web應用程序中的競爭條件
? ? ? ? ? ? ? ? ??條件競爭漏洞
? ? ? ? ? ? ? ? ??條件競爭
?
總結
- 上一篇: Web服务器漏洞和安全
- 下一篇: JQuery跨站脚本漏洞