DVWA靶場實戰(九)——Weak Session IDS

wybsignal 發表於 2023-01-22

DVWA靶場實戰(九)

九、Weak Session IDS:

1.漏洞原理:

  Weak Session IDS也叫做弱會話,當使用者登入後,在伺服器就會創造一個會話(session),叫做會話控制,接著訪問頁面的時候就不用登入,只需要攜帶Session去訪問。

  SessionID作為特定使用者訪問站站點所需要的唯一內容。如果能夠計算或輕易猜到該sessionID,則攻擊者將可以輕易的獲取訪問控制權,無需登入直接進入特定使用者介面,進而進行其他操作。

  使用者訪問伺服器的時候,在伺服器端會創造一個新的會話(session),會話中會儲存使用者的狀態和相關資訊,用於標識使用者。

  伺服器端維護所有線上使用者的session,此時認證,只需要知道哪個是使用者在瀏覽器當前的頁面即可。為了告訴伺服器應該用一個session,瀏覽器需要把當前使用者持有的SessionID告知伺服器。使用者拿到SessionID就會加密儲存到cookie上,之後只要cookies隨著http請求傳送伺服器,伺服器就知道你是誰了。SessionID一旦在生命週期內被竊取,就相當於使用者失竊。

2.Session:

Session利用的實質:由於SessionID是使用者登入之後才持有的唯一認證憑證,因此駭客不需要再攻擊登入過程(比如密碼),就可以輕易獲取訪問許可權,無需登入密碼就可以直接進入特定使用者介面,進而查詢其他漏洞如XSS、檔案上傳等。

Session劫持:就是一種透過竊取使用者SessionID,使用該SessionID登入進目標賬戶的攻擊方法,此時攻擊者實際上是使用了目標賬戶有效的Session。如果SessionID是保在Cookie中的,則這種攻擊可以稱為Cookie劫持。SessionID還可以儲存在URL中,作為一個請求的一個引數,但是這種方式的安全性難以經受考驗。

3.攻擊步驟:

(1)目標使用者需要先登入站點;

(2)登入成功後,該使用者會得到站點提供的一個會話標識SessionID;

(3)攻擊者透過某種攻擊手段捕獲SessionID;

(4)攻擊者透過捕獲到的SessionID訪問站點即可獲得目標使用者合法會話。

4.獲取Session的幾種方法:

(1)暴力破解:嘗試各種SessionID,直到破解為止;

(2)預測:如果SessionID使用非隨機的方式產生,那麼就有可能計算出來。

(3)竊取:使用網路嗅探,XSS攻擊等方式獲取。

5.防禦方式:

(1)更改Session名稱:PHP中Session的預設名稱是PHPSESSID,此變數會儲存在Cookie中,如果攻擊者不分析站點,就不能猜到Session名稱,阻擋部分攻擊。

(2)關閉透明化SessionID:透明化SessionID指當瀏覽器中的HTTP請求沒有使用Cookie來存放SessionID時,SessionID則使用URL來傳遞。

(3)設定HttpOnly透過設定Cookie的HttpOnly為true,可以防止客戶端訪問這個Cookie,從而有效的防止XSS攻擊。

(4)關閉所有的phpinfo類dump request資訊的頁面。

(5)使用User-Agent檢測請求的一致性:但有專家警告不要依賴於檢查User-Agent的一致性。這裡是因為伺服器群集中的HTTP的代理伺服器會對User-Agent進行編輯,而本群集中的多個代理伺服器在編輯該值時可能會不一致。

(6)加入Token校驗:同樣是用於檢測請求的一致性,給攻擊者製造一些麻煩,使攻擊者即使獲取了SessionID,也無法進行破壞,減少對系統造成的損失。但Token需要存放在客戶端,如果攻擊者有辦法獲取到SessionID,那麼也同樣可以獲取到Token。

6.實戰:

(1)Low:

  程式碼分析:

<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    if (!isset ($_SESSION['last_session_id'])) {
        $_SESSION['last_session_id'] = 0;
    }
    $_SESSION['last_session_id']++;
    $cookie_value = $_SESSION['last_session_id'];
    setcookie("dvwaSession", $cookie_value);
}
?>

  看程式碼low級別還是沒有什麼防護。

  開始進行攻擊,我們開啟BurpSuite,我們開始發包然後進行嘗試。

DVWA靶場實戰(九)——Weak Session IDS                

  我們這裡可以看見Cookie這一欄,“Cookie: PHPSESSID=1fa3jls5mq9ok54q3l4j44u0q1; security=low”,重新開啟一個沒有Cookie的賬戶,複製進去就可以登入。

(2)Medium:

  程式碼分析:

<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    $cookie_value = time();
    setcookie("dvwaSession", $cookie_value);
}
?> 

  我們看這個級別的程式碼,可以知道這裡是透過時間戳來生成session的,所以我們這裡利用時間戳轉換器來轉換就可以了。

  我們開始攻擊,這裡提供一個時間戳轉換器的網址:https://tool.lu/timestamp/

  與Low等級相同,我們找到Cookie,然後截包將時間戳,修改為現在就可以攻擊成功了。 DVWA靶場實戰(九)——Weak Session IDS

(3)High:

  程式碼分析:

<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    if (!isset ($_SESSION['last_session_id_high'])) {
        $_SESSION['last_session_id_high'] = 0;
    }
    $_SESSION['last_session_id_high']++;
    $cookie_value = md5($_SESSION['last_session_id_high']);
    setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], false, false);
}

?> 

  這裡我們可以看見使用了md5進行了加密。

  所以我們這裡開始攻擊,使用md5解密,發現從零開始的整數進行加密,設定拆解後構造的SessionID,可以直接免密登入。

(4)Impossible:

  程式碼分析:

<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    $cookie_value = sha1(mt_rand() . time() . "Impossible");
    setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], true, true);
}
?> 

  我們這裡檢視程式碼SessionID作為起始值。