身份驗證 (Authentication) 是確認「你是誰」的過程,是所有權限控管的基礎。若應用程式未能正確地、嚴謹地驗證使用者身份,就可能讓攻擊者輕易地冒充他人,甚至提升權限,存取受保護的資源。
什麼是不當的身份驗證?
不當的身份驗證 (Improper Authentication) 是一個廣泛的漏洞類別,泛指所有因身份驗證機制存在缺陷,而導致的安全問題。這可能包括:
- 信任了使用者可控的資料來判斷身份。
- Session 管理機制薄弱。
- 未實施多因素驗證 (MFA)。
- 允許繞過登入流程。
攻擊原理與範例
情境:可被輕易偽造的 Cookie
一個常見的錯誤是,過度信任儲存在客戶端的資訊來判斷使用者身份與權限。
- 不安全的 Cookie 設計:某應用程式為了方便,將使用者的身份資訊(如使用者名稱、角色)存放在一個 Cookie 中。更糟的是,這個 Cookie 只是簡單地用 Base64 編碼,而沒有經過加密或簽章。
1
2// Base64 解碼前的 Cookie 內容
{"username": "brian", "role": "user", "login_time": "1660000000"} - 攻擊者解碼與修改:攻擊者登入自己的帳戶後,取得了這個 Base64 編碼的 Cookie。他輕易地將其解碼,修改其中的內容,將自己的角色從
user
改為admin
。1
2// 修改後的內容
{"username": "attacker", "role": "admin", "login_time": "1660000123"} - 重新編碼並替換 Cookie:攻擊者將修改後的 JSON 物件重新用 Base64 編碼,並透過瀏覽器開發者工具,替換掉自己當前的 Cookie。
- 取得管理員權限:當他重新整理頁面時,伺服器收到了這個被竄改過的 Cookie。由於伺服器只是單純地解碼並信任其中的
role
欄位,未做任何驗證,因此便授予了攻擊者管理員權限。
風險與影響
- 權限提升與帳戶接管:攻擊者可以冒充任意使用者,甚至是管理員,完全控制系統。
- 敏感資料洩漏:存取到未經授權的資料或功能。
- 繞過付費機制:將普通使用者帳號偽造成 VIP 帳號。
防禦與預防措施
防禦的核心在於:永遠不要信任任何來自客戶端的資料,身份與權限的判斷必須在伺服器端,基於無法被輕易偽造的資訊來進行。
1. 使用安全的 Session 管理
- 伺服器端儲存:使用者的身份、角色和權限等敏感資訊,必須儲存在伺服器端的 Session 中,而不是直接放在 Cookie 裡。
- 隨機且高熵的 Session ID:Cookie 中只應存放一個由伺服器生成、長度足夠、且完全隨機的 Session ID。這個 ID 本身不應包含任何可預測的資訊(如使用者 ID、時間戳)。
- HttpOnly 旗標:為 Session Cookie 設定
HttpOnly
旗標,防止它被客戶端的 JavaScript 讀取,以抵禦 XSS 攻擊。
2. 實施多因素身份驗證 (MFA)
對於敏感的應用程式,應強制啟用 MFA(如 OTP、生物辨識),為帳戶安全增加一道額外的屏障。
3. 強化所有端點的驗證
確保應用程式的每一個需要授權的 API 端點,都會嚴格檢查當前的 Session ID 是否有效且具備足夠權限,而不是只在登入頁面做一次性檢查。
4. 避免在 URL 中洩漏 Session ID
Session ID 不應作為 URL 參數傳遞,以免被記錄在瀏覽歷史、日誌檔或 Referer 標頭中。
說些什麼吧!