Weak Session IDS也叫做弱對談,當用戶登入後,在伺服器就會創造一個對談(session),叫做對談控制,接著存取頁面的時候就不用登入,只需要攜帶Session去存取。
SessionID作為特定使用者存取站站點所需要的唯一內容。如果能夠計算或輕易猜到該sessionID,則攻擊者將可以輕易的獲取存取控制權,無需登入直接進入特定使用者介面,進而進行其他操作。
使用者存取伺服器的時候,在伺服器端會創造一個新的對談(session),對談中會儲存使用者的狀態和相關資訊,用於標識使用者。
伺服器端維護所有線上使用者的session,此時認證,只需要知道哪個是使用者在瀏覽器當前的頁面即可。為了告訴伺服器應該用一個session,瀏覽器需要把當前使用者持有的SessionID告知伺服器。使用者拿到SessionID就會加密儲存到cookie上,之後只要cookies隨著http請求傳送伺服器,伺服器就知道你是誰了。SessionID一旦在生命週期內被竊取,就相當於使用者失竊。
Session利用的實質:由於SessionID是使用者登入之後才持有的唯一認證憑證,因此駭客不需要再攻擊登入過程(比如密碼),就可以輕易獲取存取許可權,無需登入密碼就可以直接進入特定使用者介面,進而查詢其他漏洞如XSS、檔案上傳等。
Session劫持:就是一種通過竊取使用者SessionID,使用該SessionID登入進目標賬戶的攻擊方法,此時攻擊者實際上是使用了目標賬戶有效的Session。如果SessionID是保在Cookie中的,則這種攻擊可以稱為Cookie劫持。SessionID還可以儲存在URL中,作為一個請求的一個引數,但是這種方式的安全性難以經受考驗。
(1)目標使用者需要先登入站點;
(2)登入成功後,該使用者會得到站點提供的一個對談標識SessionID;
(3)攻擊者通過某種攻擊手段捕獲SessionID;
(4)攻擊者通過捕獲到的SessionID存取站點即可獲得目標使用者合法對談。
(1)暴力破解:嘗試各種SessionID,直到破解為止;
(2)預測:如果SessionID使用非隨機的方式產生,那麼就有可能計算出來。
(3)竊取:使用網路嗅探,XSS攻擊等方式獲取。
(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。
程式碼分析:
<?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,我們開始發包然後進行嘗試。
我們這裡可以看見Cookie這一欄,「Cookie: PHPSESSID=1fa3jls5mq9ok54q3l4j44u0q1; security=low」,重新開啟一個沒有Cookie的賬戶,複製進去就可以登入。
程式碼分析:
<?php $html = ""; if ($_SERVER['REQUEST_METHOD'] == "POST") { $cookie_value = time(); setcookie("dvwaSession", $cookie_value); } ?>
我們看這個級別的程式碼,可以知道這裡是通過時間戳來生成session的,所以我們這裡利用時間戳轉換器來轉換就可以了。
我們開始攻擊,這裡提供一個時間戳轉換器的網址:https://tool.lu/timestamp/
與Low等級相同,我們找到Cookie,然後截包將時間戳,修改為現在就可以攻擊成功了。
程式碼分析:
<?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,可以直接免密登入。
程式碼分析:
<?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作為起始值。