跳至主要內容
>_ITDITD網站資安平台

名詞解釋

工作階段固定(Session Fixation)是什麼 — 讓使用者用攻擊者準備好的 ID 登入的漏洞

工作階段固定(Session Fixation)是指攻擊者預先準備一個 session ID 讓受害者使用,待受害者用該 ID 登入後,再用同一個 ID 進行「冒充」的攻擊。本文以圖解說明其原理,並從防禦角度講解關鍵防禦手段(登入時重新產生 session ID、不從 URL 接收 ID、Cookie 屬性),不公開攻擊步驟。

發布於 2026-06-11 更新於 2026-06-11 閱讀時間 1 分鐘

「攻擊者準備好一個 ID,受害者卻用它完成了登入」——這就是工作階段固定。本文講解它的原理與可靠的防禦方法(不公開攻擊步驟)。

為什麼會成立(原理)

關鍵在於「登入前後 session ID 不變」這種設計。只要它不變,攻擊者在登入前就已知的 ID,在登入後仍會被當作「已認證」而通行。

① 攻擊者讓受害者使用「某個 session ID」(透過連結等)
↓ 受害者就用那個 ID 登入
② ID 沒有被重新產生=同一個 ID 變成「已認證」
↓ 攻擊者一開始就知道那個 ID
③ 用同一個 ID 存取=冒充受害者
如果登入後 ID 不變,攻擊者事先已知的 ID 就會原樣變成已認證狀態。

它有時會與 CSRFXSS 組合使用,但工作階段固定本身的本質只有一點:「登入時沒有重新產生 ID」。

防禦:登入時重新產生 ID

1

登入成功時重新產生 session ID(最重要)

在認證成立的那一刻,丟棄舊 ID 並發出新的 session ID(許多框架的 session regenerate / renew)。事先埋下的 ID 立即失效。在權限提升的操作(如提升為管理員等)時也要重新產生。
2

不接受透過 URL 指定 session ID

session ID 要用 Cookie 處理,忽略從 URL 參數指定的 ID。堵住攻擊者讓受害者踩中「想要固定的 ID」的入口。
3

加固 Cookie 屬性

給工作階段 Cookie 加上 HttpOnly(JS 無法讀取)、Secure(僅 HTTPS)、SameSite(抑制從其他站點發起的傳送)。把相關的劫持路徑一併削弱。
4

設定合理的失效

透過固定時長、登出、修改密碼使工作階段失效。不讓被固定的 ID 長期存活。

本站觀點:別關掉框架的『重新產生』

工作階段固定不需要自己精心設計的對策,靠「登入時重新產生 ID」這一招基本就能封堵。重要的是不要不小心關掉、也不要忘記呼叫框架已經準備好的這個機制。與其自己實作一套工作階段管理,不如依靠經過實戰檢驗的實作的預設行為,更安全。本站堅持「認證和金鑰相關的東西不自己造、不關掉預設的安全側」這一原則。與 IDOR 一樣,認證、授權相關的關鍵,就是「靠機制讓它每次都生效」。

延伸閱讀

FAQ

Q工作階段固定和工作階段劫持有什麼區別?
A

工作階段劫持(hijacking)是「竊取」別人已經發出的 session ID 的攻擊。工作階段固定(fixation)正相反,是攻擊者先把「自己已知的 ID」交給受害者使用,等待受害者用該 ID 登入的攻擊。它的特點不是竊取,而是讓一個一開始就已知的 ID 變成已認證狀態。

Q最有效的防禦是什麼?
A

就是『在登入的那一刻重新產生 session ID』。許多框架和工作階段函式庫都有這個功能(session regenerate / renew),在認證成立的時刻丟棄舊 ID 並發出新 ID。僅此一項,攻擊者事先埋下的 ID 就會失效。在權限提升的操作(如提升為管理員等)時也要重新產生。

Q為什麼把 session ID 放進 URL 很危險?
A

ID 一旦出現在 URL 中,就容易透過連結分享、Referer、日誌、瀏覽器歷程外洩給第三方,成為攻擊者讓受害者踩中「想要固定的 ID」的入口。session ID 應當用 Cookie 處理而不是 URL 參數,並且不接受透過 URL 指定 ID,這樣才安全。