目錄
一、Session ID
二、源碼分析
1、index.php
2、impossible.php
三、Weak Session IDs安全級別對比
四、impossible防范方法分析
1、高隨機性會話 ID 生成
2、嚴格的 Cookie 作用域限制
3、安全的傳輸與存儲控制期
本系列為通過《DVWA靶場通關筆記》的Weak Session IDs關卡(low,medium,high,impossible共4關)滲透集合,通過對相應關卡源碼的代碼審計找到講解滲透原理并進行滲透實踐。本文為Weak Session IDs impossible關卡的原理分析部分,講解相對于low、medium和high級別,為何對其進行滲透測試是Impossible的。
一、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,具體如下所示。
二、源碼分析
1、index.php
進入DVWA靶場Weak Session IDs源目錄,找到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、impossible.php
進入DVWA靶場Weak Session IDs的source源碼目錄,找到impossible.php源碼,分析其為何能讓這一關卡名為不可能實現Weak Session IDs滲透。
打開源碼impossible.php,如下所示。
詳細注釋后的impossible.php源碼如下所示,impossible.php 在接收 POST 請求時,通過 sha1 哈希處理隨機數、時間戳與固定字符串的拼接結果生成高隨機性會話 ID,設置為 dvwaSession cookie,限定 1 小時有效期、特定路徑和域名,且僅 HTTPS 傳輸并禁止 JS 訪問,實現安全會話管理。
<?php
// 初始化HTML輸出變量
$html = "";
// 檢查請求方法是否為POST
if ($_SERVER['REQUEST_METHOD'] == "POST") {// 生成會話ID:使用sha1哈希函數處理隨機數、時間戳和固定字符串$cookie_value = sha1(mt_rand() . time() . "Impossible");// 設置名為dvwaSession的Cookiesetcookie("dvwaSession", // Cookie名稱$cookie_value, // Cookie值(即會話ID)time() + 3600, // 過期時間:當前時間+1小時"/vulnerabilities/weak_id/", // 作用路徑$_SERVER['HTTP_HOST'], // 作用域名(當前主機)true, // 僅通過HTTPS傳輸(Secure屬性)true // 禁止JavaScript訪問(HttpOnly屬性));
}
?>
-
會話 ID 生成:
- 當接收到 POST 請求時,生成不可預測的會話 ID(
dvwaSession
) - 生成方式:通過
mt_rand()
(隨機數)+?time()
(當前時間戳)+ 固定字符串 "Impossible" 拼接后,再經sha1()
哈希處理
- 當接收到 POST 請求時,生成不可預測的會話 ID(
-
安全的 Cookie 設置:
- 限制作用路徑:僅在
/vulnerabilities/weak_id/
路徑下有效 - 綁定當前域名:防止跨域訪問
- 強制 HTTPS 傳輸(
secure
屬性為true
) - 啟用 HttpOnly 保護:阻止客戶端腳本(如 JavaScript)訪問 Cookie,防范 XSS 攻擊盜取會話
- 限制作用路徑:僅在
-
防護目標:
- 通過高隨機性的會話 ID 生成算法,徹底避免會話 ID 被預測或猜測
- 借助 Cookie 的安全屬性,增強會話標識的傳輸和存儲安全性,符合 OWASP 會話管理最佳實踐
三、Weak Session IDs安全級別對比
impossible級別
相對于Low級別、Medium級別、High級別,四個級別的防范措施對比如下所示。
安全級別 | 會話 ID 生成方式 | Cookie 設置細節 | 安全性分析 |
---|---|---|---|
Low | 基于會話變量last_session_id 自增生成數字(如 1、2、3...) | 僅設置dvwaSession 鍵值,無有效期、路徑、域名限制,無安全屬性 | 完全可預測,無任何安全防護,極易被猜測 |
Medium | 使用當前時間戳(time() )作為會話 ID | 僅設置dvwaSession 鍵值,無有效期、路徑、域名限制,無安全屬性 | 看似隨機,但連續生成時存在時間規律,易被推測 |
High | 將自增會話變量last_session_id_high 經md5 哈希處理生成 | 有效期 1 小時,限制路徑/vulnerabilities/weak_id/ 和當前域名,未啟用secure 和HttpOnly | 哈希增加復雜度,但源為可預測的遞增數值,仍有被破解可能;缺少核心安全屬性 |
Impossible | 拼接mt_rand() 隨機數、時間戳和固定字符串后經sha1 哈希生成 | 有效期 1 小時,限制路徑/vulnerabilities/weak_id/ 和當前域名,啟用secure (僅 HTTPS)和HttpOnly (禁止 JS 訪問) | 高隨機性,結合嚴格的 Cookie 安全屬性,難以被預測或盜取,安全性極高 |
四、impossible防范方法分析
impossible.php 的功能是在接收到 POST 請求時,通過將隨機數、當前時間戳和固定字符串 “Impossible” 拼接后經 sha1 哈希處理生成高隨機性的會話 ID(dvwaSession),并設置該 Cookie,其有效期為 1 小時,限制作用路徑為/vulnerabilities/weak_id/
,綁定當前域名,且僅通過 HTTPS 傳輸并禁止 JavaScript 訪問,以實現難以預測的安全會話管理。
防護機制 | 作用場景 | 核心目標 |
---|---|---|
高隨機性會話 ID 生成(mt_rand() 隨機數 + 時間戳 + 固定字符串拼接后經sha1 哈希) | 生成會話標識時 | 確保會話 ID 難以被預測或猜測,從源頭杜絕通過 ID 推測入侵的可能 |
限制 Cookie 作用路徑(/vulnerabilities/weak_id/ ) | Cookie 在服務器與客戶端間傳輸及存儲時 | 限定 Cookie 僅在特定路徑下生效,減少跨路徑訪問風險 |
綁定當前域名($_SERVER['HTTP_HOST'] ) | Cookie 作用域控制 | 防止 Cookie 被其他域名訪問,增強跨域安全性 |
設置有效期(1 小時,time()+3600 ) | 會話生命周期管理 | 避免會話長期有效導致的潛在風險,自動終止過期會話 |
啟用secure 屬性(僅通過 HTTPS 傳輸) | Cookie 傳輸過程中 | 確保 Cookie 在加密通道中傳輸,防止傳輸過程中被竊聽 |
啟用HttpOnly 屬性(禁止 JavaScript 訪問) | 客戶端腳本環境中 | 防范 XSS 攻擊通過腳本盜取 Cookie,保護會話標識安全 |
僅響應 POST 請求生成會話 ID | 處理會話 ID 生成的請求時 | 增加請求來源的驗證門檻,減少非預期請求生成會話的風險 |
1、高隨機性會話 ID 生成
通過mt_rand()
生成隨機數、time()
獲取當前時間戳,結合固定字符串 “Impossible” 拼接后,使用sha1()
哈希算法生成會話 ID。隨機數確保每次生成的值無規律,時間戳增加實時性差異,哈希處理進一步混淆原始數據,使 ID 難以被預測或逆向破解,從源頭杜絕通過猜測會話 ID 進行攻擊的可能,大幅提升會話標識的唯一性和不可預測性。
$cookie_value = sha1(mt_rand() . time() . "Impossible");
2、嚴格的 Cookie 作用域限制
/vulnerabilities/weak_id/
限制 Cookie 僅在該路徑下生效,$_SERVER['HTTP_HOST']
綁定當前域名。這種限制確保 Cookie 不會被其他路徑或域名的腳本訪問,縮小了 Cookie 的作用范圍,減少了跨路徑、跨域的安全風險,防止惡意網站通過跨域請求獲取或操縱會話 Cookie,增強了 Cookie 的訪問控制安全性
setcookie(..., "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], ...);
3、安全的傳輸與存儲控制期
time()+3600
設置 Cookie 有效期為 1 小時,避免會話長期有效導致的風險;true
(第一個)啟用secure
屬性,強制 Cookie 僅通過 HTTPS 加密傳輸,防止傳輸過程中被竊聽;true
(第二個)啟用HttpOnly
屬性,禁止 JavaScript 訪問 Cookie,有效防范 XSS 攻擊通過腳本盜取會話標識,從傳輸和客戶端存儲層面雙重保護 Cookie 安全。
// weak_id/source/impossible.php 中的代碼
setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], true, // secure屬性(僅HTTPS傳輸)true // HttpOnly屬性(禁止JavaScript訪問)
);