什麼是 Session Fixation(會話固定攻擊)?

更新日期: 2025 年 3 月 4 日

Session Fixation(會話固定攻擊)是一種駭客透過設定或操控受害者的會話 ID(Session ID)來劫持帳戶的攻擊方式。

一般來說,當使用者登入網站時,伺服器會產生一個「Session ID」來識別該用戶的登入狀態。

如果網站的會話管理不夠安全,攻擊者就能預先設定或強迫受害者使用特定的 Session ID,等受害者登入後,攻擊者就能用相同的 Session ID 偽裝成受害者,進行未授權的操作。

例如竊取個資、轉帳、變更密碼等。

這種攻擊之所以有效,是因為某些網站在用戶登入後不會重新生成新的 Session ID,讓攻擊者可以持續使用相同的 Session ID 來冒充受害者。


Session Fixation 的攻擊流程

攻擊者獲取或設定一個 Session ID

首先,攻擊者需要取得或設定一個 Session ID

網站可能允許的 Session ID 傳遞方式:

  1. 透過 URL 傳遞(不安全,容易被攻擊): https://example.com?sessionid=123456
    • 若網站允許這種方式來設定使用者的 Session ID,攻擊者就可以預先設定一個固定的 Session ID,然後想辦法讓受害者使用這個 ID 來登入。
  2. 透過 Cookie 設定
    • 有些網站可能允許外部設定 Cookie(例如 JavaScript 可寫入 document.cookie),攻擊者可以利用某些漏洞強制受害者的瀏覽器設定一個攻擊者指定的 Session ID。

攻擊者引誘受害者使用該 Session ID

接下來,攻擊者會想辦法讓受害者使用攻擊者預設的 Session ID,常見手法包括:

  • 釣魚郵件:發送包含惡意 Session ID 連結的電子郵件,例如:
親愛的用戶,請點擊以下連結來更新您的帳戶資訊:
https://example.com/login?sessionid=ABC123
  • 社交工程:在論壇、社群媒體張貼誘人的連結,吸引受害者點擊:
超好康!免費獲得 Netflix VIP 會員:https://example.com/login?sessionid=ABC123
  • 跨網站請求偽造(CSRF)
    • 如果受害者的瀏覽器自動發送 Cookie,攻擊者可能透過 CSRF 技巧強制使用攻擊者設定的 Session ID。

受害者點擊惡意連結後,該 Session ID 會變成他接下來的請求使用的 ID

如果網站沒有適當的防範措施,那麼這個 ID 就會被沿用,成為受害者的身份識別碼。

受害者登入後,Session ID 仍然不變

當受害者輸入帳號密碼登入網站時,網站並未產生新的 Session ID,而是沿用攻擊者設定的 ID

正常情況應該是這樣(安全的方式):

受害者點擊惡意連結 (sessionid=ABC123)  
 受害者輸入帳號密碼登入  
 伺服器產生新的 Session ID(例如 XYZ999)  
 攻擊者的 Session ID(ABC123)失效,攻擊失敗。

但如果網站沒做好防範(不安全方式):

受害者點擊惡意連結 (sessionid=ABC123)  
 受害者輸入帳號密碼登入  
 **伺服器沿用 sessionid=ABC123,不更新 Session ID**  
 攻擊者依然可以使用這個 Session ID 登入。
  • 由於受害者已經成功登入,這個 Session ID 變成合法的身份憑證
  • 攻擊者只需要使用這個 Session ID,就能冒充受害者。

攻擊者使用相同的 Session ID 登入

因為網站允許 Session ID 固定不變,所以攻擊者只需要使用相同的 Session ID,即可進入受害者的帳戶。

+----------------------------+
|   攻擊者 (Hacker)          |
|                            |
|  使用相同的 Session ID 登入 |
|  https://example.com       |
|  Cookie: sessionid=ABC123  |
+----------------------------+
          
+----------------------------+
|    受害者的帳戶 (已登入)   |
|                            |
|  攻擊者成功取得權限         |
|  可查看資料、轉帳、修改密碼 |
+----------------------------+

攻擊者現在擁有完整的受害者權限,可能會執行以下惡意行為:

  • 讀取受害者的個人資訊(如電子郵件、聯絡方式)。
  • 修改受害者的密碼,鎖住受害者的帳戶。
  • 轉移受害者的金錢或虛擬財產(如遊戲點數、加密貨幣)。

Session Fixation 的攻擊方式詳解

URL 參數傳遞 Session ID

攻擊過程:
某些網站會在 URL 中直接傳遞 Session ID,例如:

https://example.com/dashboard?sessionid=ABC123

如果網站允許攻擊者指定 Session ID,攻擊者可以先建立一個合法的會話(Session),並獲得相應的 Session ID。

例如,攻擊者請求網站並獲得 sessionid=XYZ789,然後將該 URL 發送給受害者:

https://example.com/dashboard?sessionid=XYZ789

當受害者點擊該連結並登入時,伺服器會將該 Session ID 與受害者的帳戶綁定,導致受害者的會話其實已經是攻擊者預設的。

這樣一來,攻擊者可以使用相同的 Session ID 來存取受害者的帳戶,達成攻擊目的。

防範措施:

  • 禁止在 URL 傳遞 Session ID:應該使用 Cookie 來存儲 Session ID,而不是透過 URL 傳遞。
  • 強制登入後變更 Session ID:使用者成功登入後,伺服器應產生一個新的 Session ID,以防止攻擊者利用預設 Session ID 進行攻擊。
  • 使用 HTTP Referer 驗證:可檢查請求的來源是否可信,以減少未授權的 Session 傳遞。

Cookie 設定操控

攻擊過程:
某些網站允許 JavaScript 或 HTTP 回應標頭來設定 Cookie,這可能被攻擊者利用來操控 Session ID,進而發動 Session Fixation 攻擊。

主要手法包括:

  • XSS(跨網站指令碼攻擊):如果網站存在 XSS 漏洞,攻擊者可以在網頁中注入惡意 JavaScript。

    當受害者的瀏覽器執行這段程式碼後,Session ID 就會被攻擊者預先設定,使受害者的會話處於攻擊者的控制之下。

    例如:
document.cookie = "sessionid=XYZ789; path=/; domain=example.com";
  • CSRF(跨站請求偽造):攻擊者可以引導受害者瀏覽特定網頁,使其向受害網站發送惡意請求,並設置攻擊者指定的 Session ID。

    這可能導致瀏覽器自動發送請求,使受害者的 Session 被固定。

    例如,透過 HTML 內嵌請求:
<img src="https://example.com/setcookie?sessionid=XYZ789">

防範措施:

  • 設置 HttpOnly 屬性:防止 JavaScript 存取 Cookie,降低 XSS 攻擊風險。
  • 設置 Secure 屬性:確保 Cookie 僅透過 HTTPS 傳輸,避免被攔截。
  • 設置 SameSite 屬性:防範 CSRF 攻擊,防止來自第三方網站的 Cookie 傳遞。
  • 驗證 Session ID 來源:伺服器端應檢查 Session ID 是否為合法來源,以確保安全性。

MITM(中間人攻擊)

攻擊過程:
如果網站未啟用 HTTPS,而是使用不安全的 HTTP 來傳輸 Session ID,攻擊者可以透過中間人攻擊(Man-in-the-Middle, MITM)攔截並篡改會話資料。

典型攻擊方式包括:

  • 攔截伺服器回應:攻擊者監聽受害者的 HTTP 請求,並在伺服器回應中修改 Set-Cookie 標頭。

    這樣,受害者的瀏覽器將使用攻擊者指定的 Session ID,導致會話被固定。

    例如:
Set-Cookie: sessionid=XYZ789; Path=/; HttpOnly
  • 偽造 Wi-Fi 熱點:攻擊者可架設惡意 Wi-Fi 熱點(例如免費公共 Wi-Fi),誘導受害者連線,然後攔截 HTTP 流量並修改 Cookie,讓受害者使用攻擊者預設的 Session ID。

防範措施:

  • 強制使用 HTTPS(TLS/SSL):確保所有會話通訊加密,防止 MITM 攻擊。
  • 設置 Secure 屬性:確保 Cookie 僅能透過 HTTPS 傳輸,避免攔截風險。
  • 使用 HSTS(HTTP Strict Transport Security):強制瀏覽器僅透過 HTTPS 存取網站,降低被降級攻擊(Downgrade Attack)的風險。

總結

攻擊方式描述防禦方法
URL 參數傳遞 Session ID攻擊者在 URL 中傳遞固定的 Session ID,誘導受害者使用禁止 URL 傳遞 Session ID、強制登入後變更 Session ID
Cookie 設定操控攻擊者透過 XSS 或 CSRF 設定特定的 Session ID設置 HttpOnly、Secure、SameSite 屬性,防範 XSS/CSRF
MITM 攻擊攻擊者攔截 HTTP 流量並修改 Cookie強制使用 HTTPS,啟用 HSTS,設置 Secure 屬性

Session Fixation 的核心問題在於,受害者使用的 Session ID 其實是攻擊者預設的,導致攻擊者能夠完全控制受害者的會話。

因此,網站開發者應該確保 Session 管理的安全性,避免這類攻擊發生。


結論

Session Fixation 是一種讓攻擊者強迫受害者使用特定 Session ID,進而劫持帳戶的攻擊手法。

如果網站在用戶登入後沒有重新產生新的 Session ID,駭客就可以使用相同的 Session ID 來冒充受害者,存取敏感資料。

防範的關鍵是:

  1. 登入後強制重新產生 Session ID,讓舊的 Session ID 失效。
  2. 使用 Cookie 儲存 Session,而非 URL 參數,避免 Session 被竊取。
  3. 設定 HttpOnly、Secure、SameSite 屬性,防止 Session ID 被劫持。

這些簡單的防護措施可以大幅降低 Session Fixation 攻擊的風險,確保使用者的帳戶安全。

Similar Posts