目錄
一、Session ID
二、代碼審計(Medium級別)
1、配置security為Medium級別
2、源碼分析
(1)index.php
(2)Medium.php
(3)對比分析
(4)滲透思路
三、滲透實戰
1、點擊生成會話ID
2、bp抓包分析
3、預測后續會話 ID
DVWA(Damn Vulnerable Web Application)中的 弱會話Weak Session IDs關卡是用于練習和演示弱會話ID的不同場景,不同安全等級存在不同的脆弱點和繞過方法,本小節對中等級別的關卡進行滲透實戰。
一、Session ID
Session ID(會話 ID)是 Web 應用程序中用于標識用戶會話的唯一標識符,是用戶訪問網站時的 “電子身份證”。會話id的核心作用和身份證類似,id用于區分不同的用戶,核心作用如下所示。
- 區分用戶會話:當用戶訪問網站時,服務器會為其創建一個會話(Session),并生成唯一的 Session ID,通過 Cookie 存儲在用戶瀏覽器或 URL 中。后續請求攜帶該 ID,服務器即可識別用戶身份,保持會話狀態(如登錄狀態、購物車數據等)。
- 跨請求狀態保持:由于默認情況下HTTP應用層協議是無狀態的,Session ID 讓服務器能 “記住” 用戶的操作,例如用戶登錄后,服務器通過 Session ID 關聯其權限和數據。
Session ID(會話 ID)通常使用Cookie 存儲:默認通過名為PHPSESSID(PHP)等的 Cookie 傳輸,瀏覽器自動攜帶。以DVWA的盲注關卡Impossible級別為例,使用bp抓包,如下報文的sesssion id使用PHPSESSID存儲,值為tssqfshe2838kcg5nbkf4464u3,具體如下所示。
二、代碼審計(Medium級別)
1、配置security為Medium級別
進入到弱會話id關卡,完整URL地址具體如下所示。
http://192.168.59.1/dvwa/vulnerabilities/weak_id/
2、源碼分析
(1)index.php
進入DVWA靶場源目錄,找到index.php源碼。
這段
PHP
代碼是
Damn Vulnerable Web Application (DVWA)
中
“弱會話
ID
”
演示頁面的核心邏輯,通過對比不同安全級別的實現方式,幫助開發者理解弱會話
ID
的風險和安全的會話管理實踐。主要功能如下所示。
- 安全級別控制:根據用戶 Cookie 中存儲的安全級別(低、中、高、安全),動態加載不同的會話 ID 生成算法實現文件,展示不同防護級別的會話管理場景。
- 用戶交互界面:
- 提供一個 “Generate” 按鈕,每次點擊時會觸發會話 ID 的生成。
- 頁面說明文字提示用戶每次點擊按鈕會設置一個名為 dvwaSession 的新 Cookie。
- 會話 ID 生成演示:根據低、中、高、安全共4個級別演示會話id的生成。
- 輔助功能:
- 提供幫助文檔和源代碼查看功能。
- 根據不同安全級別顯示相應的會話 ID 生成結果
經過注釋后的詳細代碼如下所示。
<?php
// 定義網站根目錄路徑常量,用于后續文件引用
define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );
// 引入DVWA頁面基礎功能庫
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';// 啟動頁面,驗證用戶是否已認證并初始化PHPIDS(入侵檢測系統)
dvwaPageStartup( array( 'authenticated', 'phpids' ) );// 創建新頁面實例
$page = dvwaPageNewGrab();
// 設置頁面標題
$page[ 'title' ] = 'Vulnerability: Weak Session IDs' . $page[ 'title_separator' ].$page[ 'title' ];
// 設置頁面ID,用于導航和標識
$page[ 'page_id' ] = 'weak_id';
// 添加幫助按鈕和源代碼按鈕
$page[ 'help_button' ] = 'weak_id';
$page[ 'source_button' ] = 'weak_id';// 連接數據庫
dvwaDatabaseConnect();// 設置HTTP請求方法(默認為GET)
$method = 'GET';
// 初始化不同安全級別對應的源文件
$vulnerabilityFile = '';// 根據安全級別Cookie值選擇不同的實現文件
switch( $_COOKIE[ 'security' ] ) {case 'low':// 低安全級別:使用易預測的會話ID生成算法$vulnerabilityFile = 'low.php';break;case 'medium':// 中安全級別:部分增強的會話ID生成算法$vulnerabilityFile = 'medium.php';break;case 'high':// 高安全級別:進一步增強的會話ID生成算法$vulnerabilityFile = 'high.php';break;default:// 安全模式:使用安全的會話ID生成算法$vulnerabilityFile = 'impossible.php';$method = 'POST';break;
}// 引入選定的實現文件
require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/weak_id/source/{$vulnerabilityFile}";// 構建頁面主體內容,包含說明文字和生成會話ID的按鈕
$page[ 'body' ] .= <<<EOF
<div class="body_padded"><h1>Vulnerability: Weak Session IDs</h1><p>This page will set a new cookie called dvwaSession each time the button is clicked.<br /></p><form method="post"><input type="submit" value="Generate" /></form>
$htmlEOF;/*
Maybe display this, don't think it is needed though
if (isset ($cookie_value)) {$page[ 'body' ] .= <<<EOFThe new cookie value is $cookie_value
EOF;
}
*/// 輸出最終HTML頁面
dvwaHtmlEcho( $page );?>
(2)Medium.php
進入DVWA靶場源目錄,找到Medium.php源碼。
打開源碼medium.php,分析可知這段代碼實現了一個簡單的會話 ID 生成機制功能,如下所示。
代碼的功能如下所示。
- 當用戶通過 POST 請求訪問頁面時。
- 生成一個基于當前時間戳的會話 ID。
- 將該 ID 存儲在名為dvwaSession的 Cookie 中。
- 未設置 Cookie 的安全屬性(如Secure、HttpOnly)。
詳細注釋后的代碼如下所示。
<?php
// 初始化HTML輸出變量(用于存儲頁面內容)
$html = "";// 檢查當前請求是否為POST方法(例如用戶點擊表單提交按鈕)
if ($_SERVER['REQUEST_METHOD'] == "POST") {// 將會話ID設置為當前時間戳(以秒為單位)$cookie_value = time();// 設置名為"dvwaSession"的Cookie,值為當前時間戳// 默認有效期:瀏覽器關閉時失效// 默認路徑:當前頁面所在路徑// 未設置Secure屬性(允許HTTP傳輸)// 未設置HttpOnly屬性(允許JavaScript訪問)setcookie("dvwaSession", $cookie_value);
}
?>
(3)對比分析
low級別和Medium級別的區別如下所示。
對比項 | Low級別 | Medium級別 |
會話 ID 生成方式 | 基于會話計數器遞增(初始值 0,每次請求 + 1) | 基于當前時間戳time()函數返回秒級時間戳 |
可預測性 | 高(攻擊者可通過猜測遞增規律預測會話 ID) | 中(短時間內可能重復,如同一秒內的請求) |
唯一性 | 低(會話重置或服務器重啟可能導致 ID 重復) | 中(同一秒內的請求會生成相同 ID) |
安全性 | 低(會話固定攻擊風險高,且 ID 易被枚舉) | 中(時間戳雖動態但粒度粗,仍有被預測風險) |
(4)滲透思路
核心問題:具有弱會話 ID(Predictable Session ID)攻擊可能性。
-
會話 ID 可預測
- 時間戳以秒為單位遞增,攻擊者可輕松計算未來 / 過去的會話 ID。
- 示例:若當前時間戳為
1630482000
,攻擊者可猜測下一個可能是1630482001。
-
時間精度不足
- 同一秒內的所有請求會生成相同的會話 ID,導致沖突。
- 攻擊者可通過并發請求碰撞有效會話。
-
缺乏隨機性
- 完全依賴確定性的系統時間,無隨機因子。
- 攻擊者無需破解,直接推算即可。
-
Cookie 安全缺失
- 未設置
Secure
屬性,Cookie 可通過 HTTP 明文傳輸。 - 未設置
HttpOnly
屬性,易受 XSS 攻擊竊取。 - 未設置有效期(默認會話 Cookie),用戶關閉瀏覽器后需重新認證。
- 未設置
影響:攻擊者可通過時間戳或枚舉會話 ID 值,偽造合法用戶會話,獲取未授權訪問權限。
三、滲透實戰
1、點擊生成會話ID
bp開啟攔截功能,進入靶場的脆弱的session id關卡,點擊生成會話id三次,如下所示。
2、bp抓包分析
第1個報文的session id為dvwaSession=1747368161,如下圖所示。
1747368161 對應的 UTC 時間是?2024 年 12 月 16 日 13:22:41,可以通過如下函數進行轉換,說明這個為時間戳轉換,具體code如下所示。
from datetime import datetime
print(datetime.utcfromtimestamp(1747368161).strftime('%Y-%m-%d %H:%M:%S'))
# 輸出:2024-12-16 13:22:41
第2個報文的session id為dvwaSession=1747368380(1747368380 對應的 UTC 時間是?2024 年 12 月 16 日 13:26:20),如下圖所示。?
3、預測后續會話 ID
由于會話 ID 是簡單通過時間戳轉換,攻擊者可通過如下方式進行預測。
- 記錄受害者登錄時的時間戳(如1747368380)
- 預測后續會話 ID 范圍(如1747368301至1747368360)
- 逐個嘗試這些值,直到獲取訪問權限