「攻擊者準備好一個 ID,受害者卻用它完成了登入」——這就是工作階段固定。本文講解它的原理與可靠的防禦方法(不公開攻擊步驟)。
為什麼會成立(原理)
關鍵在於「登入前後 session ID 不變」這種設計。只要它不變,攻擊者在登入前就已知的 ID,在登入後仍會被當作「已認證」而通行。
它有時會與 CSRF 或 XSS 組合使用,但工作階段固定本身的本質只有一點:「登入時沒有重新產生 ID」。
防禦:登入時重新產生 ID
登入成功時重新產生 session ID(最重要)
不接受透過 URL 指定 session ID
加固 Cookie 屬性
HttpOnly(JS 無法讀取)、Secure(僅 HTTPS)、SameSite(抑制從其他站點發起的傳送)。把相關的劫持路徑一併削弱。設定合理的失效
本站觀點:別關掉框架的『重新產生』
工作階段固定不需要自己精心設計的對策,靠「登入時重新產生 ID」這一招基本就能封堵。重要的是不要不小心關掉、也不要忘記呼叫框架已經準備好的這個機制。與其自己實作一套工作階段管理,不如依靠經過實戰檢驗的實作的預設行為,更安全。本站堅持「認證和金鑰相關的東西不自己造、不關掉預設的安全側」這一原則。與 IDOR 一樣,認證、授權相關的關鍵,就是「靠機制讓它每次都生效」。
延伸閱讀
FAQ
Q工作階段固定和工作階段劫持有什麼區別?
工作階段劫持(hijacking)是「竊取」別人已經發出的 session ID 的攻擊。工作階段固定(fixation)正相反,是攻擊者先把「自己已知的 ID」交給受害者使用,等待受害者用該 ID 登入的攻擊。它的特點不是竊取,而是讓一個一開始就已知的 ID 變成已認證狀態。
Q最有效的防禦是什麼?
就是『在登入的那一刻重新產生 session ID』。許多框架和工作階段函式庫都有這個功能(session regenerate / renew),在認證成立的時刻丟棄舊 ID 並發出新 ID。僅此一項,攻擊者事先埋下的 ID 就會失效。在權限提升的操作(如提升為管理員等)時也要重新產生。
Q為什麼把 session ID 放進 URL 很危險?
ID 一旦出現在 URL 中,就容易透過連結分享、Referer、日誌、瀏覽器歷程外洩給第三方,成為攻擊者讓受害者踩中「想要固定的 ID」的入口。session ID 應當用 Cookie 處理而不是 URL 參數,並且不接受透過 URL 指定 ID,這樣才安全。