Web安全-條件競爭漏洞

漏洞理解

條件競爭漏洞(Race condition)官方概念是——競爭條件發生在多個線程同時訪問同一個共享代碼、變量、文件等沒有進行鎖操作或者同步操作的場景中。這個漏洞存在於操作系統、數據庫、web等多個層面,像有名的髒牛(dirty cow)。

開發者在進行代碼開發時常常傾向於認爲代碼會以線性的方式執行,而且他們忽視了並行服務器會併發執行多個線程,這就會導致意想不到的結果。這個漏洞的思想和參數污染漏洞(HPP)比較像(傳送門),都是通過附加的情況使得程序異常,但原理不同。

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

漏洞實例

負數購買

對於條件競爭漏洞比較經典的案例是轉賬、購買,也是條件競爭漏洞的高發場景。這裏從數據庫層面還原一個星巴克無限購買案例,直觀解釋下這個漏洞的原理。

假設我們使用賬戶裏的1000元購買10件100元的商品,正常購買流程爲:購買物品 —> 查詢餘額是否大於商品價格 —> “購買成功,餘額-1000,商品數+1” 或者 “購買失敗,提示餘額不足”。

1、查看數據庫賬戶餘額及物品數:
在這裏插入圖片描述
2、點擊購買,攔截數據包,設置intruder發送50個數據包,線程調到25後發進行併發請求:
在這裏插入圖片描述
在這裏插入圖片描述
3、查看數據庫的日誌,可以看到對count的查看SELECT和更新UPDATE並不是線性依次執行的,所以導致在完成對count-1000的操作之前進行了另一次查詢count仍爲1000,最終結果是購買數量大於10,而餘額爲負數:
在這裏插入圖片描述
4、解決方案通常是加“鎖”,mysql執行事務前加BEGIN,後加COMMIT,從而鎖定一次事務處理,使按序進行:
在這裏插入圖片描述

文件上傳

這是upload-libs上面的一個題,題目代碼如下:

<?php

$is_upload = false;
$msg = null;

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;

    if(move_uploaded_file($temp_file, $upload_file)){
        if(in_array($file_ext,$ext_arr)){
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
	         rename($upload_file, $img_path);
          $is_upload = true;
	    }else{
   	     $msg = "只允許上傳.jpg|.png|.gif類型文件!";
 	       unlink($upload_file);
       }
    }else{
       $msg = '上傳出錯!';
    }
}
?>

這裏是先通過move_uploaded_file函數將上傳文件臨時保存,再對文件類型進行判斷,如果不在名單白裏則刪除,在白名單裏的話就進行重命名,所以這裏存在條件競爭。

我們使用多線程併發的訪問上傳的文件,總會有一次在上傳文件到刪除文件這個時間段內訪問到上傳的php文件,一旦我們成功訪問到了上傳的文件,那麼它就會向服務器寫一個shell。

我們可以使用如下方式進行繞過:用Burp開啓兩個intruder模塊,一個用於重複上傳木馬文件,另一個用於重複訪問木馬文件。

1、首先上傳1.php文件,抓包,放到intruder模塊中:
在這裏插入圖片描述2、然後訪問我們上傳文件後的路徑,抓包,也放到intruder模塊中:
在這裏插入圖片描述3、設置這兩個intruder的payloads,Payload type設置爲Null payloads,然後設置訪問次數(我這裏設置的50000):
在這裏插入圖片描述4、最後同時重放兩個intruder模塊,可以看到訪問了50000次,最後只有4次成功了。其他的訪問次數裏,有小部分是狀態碼返回200但執行出錯,大部分是返回404:
在這裏插入圖片描述

進階挖掘

漏洞場景

挖掘條件競爭漏洞需要關注的功能點有:

  • 購買:付款/購買/積分/訂單操縱相關的漏洞(上文案例1);
  • 上傳:多過程處理,如文件上傳處理(上文案例2);
  • 兌換:積分/優惠券/註冊邀請碼(下文案例1);
  • 繞過數量限制(下文案例2);
  • 此外還可能存在DOS攻擊(下文案例3)。

特點總結來說就是——共享同一資源,生成其他結果。

【注意】這個漏洞具有偶現性,很受環境因素的影響,比如網絡延遲、服務器的處理能力等,所以只執行一次可能並不會成功,儘量多嘗試幾次。

其他實例

1、積分兌換

Hackerone上一個flag兌換邀請碼的案例,使用同一Flag請求70次並獲得了2次邀請:
在這裏插入圖片描述
2、繞過數量限制

Shopify商店具有添加地址的功能,但擁有的地點數量最多是4個,可以通過多線程發包繞過軟限制:
在這裏插入圖片描述可以看到成功成功創建了8個地址:
在這裏插入圖片描述同樣的案例也有:繞過員工帳戶數量限制、單次投票機會等,有數量上限的場景都可以嘗試多線程繞過。

3、DOS攻擊

一個在建議提交處無頻率限制從而導致DOS的案例:
在這裏插入圖片描述

漏洞防禦

1、對於業務端條件競爭的防範,一般的方法是設置鎖;

2、對於文件上傳,一定要經過充分完整的檢查之後再上傳;

3、在操作系統的角度,共享數據要進行上鎖保護。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章