功能級別的存取控制漏洞 (Broken Function Level Authorization, BFLA),有時也稱作「遺漏功能級別存取控制」,是一種極其常見且危險的授權 (Authorization) 漏洞。它發生在當應用程式未能對每個功能或 API 端點,都進行嚴格的權限檢查時,導致低權限使用者可以執行他們本不應有權限的高權限操作。
什麼是 BFLA 漏洞?
簡單來說,BFLA 漏洞的核心是:攻擊者可以直接請求並執行一個他「不應該能看到或使用」的功能。
Web 應用程式通常會根據使用者的角色(如普通使用者、管理員)來決定在介面上顯示哪些功能按鈕。例如,普通使用者看不到「使用者管理」的按鈕。然而,開發者常常會犯一個錯誤:他們只在前端介面上隱藏了這個按鈕,卻沒有在後端對應的 API 端點上加上權限檢查。
這就意味著,即使按鈕被隱藏了,但如果攻擊者知道了那個管理功能的 URL,他就可以直接在瀏覽器中輸入該網址,繞過介面,直接執行管理功能。
攻擊原理與範例
情境:猜測 URL 成為管理員
- 正常情況:一個網站的管理後台 URL 是
https://example.com/admin
。當管理員登入時,他可以看到所有管理功能。當普通使用者登入時,他們會被導向到個人資料頁,看不到任何管理後台的連結。 - 發現漏洞:攻擊者以普通使用者的身份登入後,他猜測網站可能存在一個管理員專用的頁面。他嘗試在瀏覽器中直接訪問一些常見的管理路徑,例如
/admin
,/dashboard
,/manage
。 - 攻擊成功:當他訪問
https://example.com/admin/create_user
時,伺服器後端沒有檢查當前登入的使用者是否為管理員,只是單純地回傳了「建立新使用者」的頁面。攻擊者因此可以任意建立新帳號,甚至可以將新帳號的角色設定為「管理員」,從而完全控制整個網站。
BFLA vs. IDOR
BFLA 和 IDOR (不安全的直接物件引用) 都是授權漏洞,但關注點不同:
- IDOR:關注「對資料的存取權」。你是一個普通使用者,你不應該能看到別人的訂單。
- BFLA:關注「對功能的使用權」。你是一個普通使用者,你根本就不應該能使用「刪除訂單」這個功能,無論是刪除自己的還是別人的。
風險與影響
- 權限提升與系統接管:普通使用者可以執行管理員才能做的操作,如新增/刪除使用者、修改系統設定等。
- 大規模資料洩漏:銷售部門的員工可能透過直接訪問 URL,存取到財務部門的敏感報表。
- 業務邏輯破壞:任何受保護的業務功能都可能被未經授權的使用者濫用。
防禦與預防措施
核心原則:預設拒絕,並在伺服器端對每個功能請求進行集中式的權限檢查。
1. 使用集中化的授權機制
- 不要在每個 API 端點中各自撰寫零散的權限檢查邏輯。
- 應建立一個集中的、可重複使用的授權模組或中介軟體 (Middleware)。這個模組應在處理任何請求之前被調用,根據使用者的角色和權限,來決定是否允許其繼續執行後續的功能。
2. 預設拒絕 (Default Deny)
- 你的授權策略應該是「預設拒絕所有操作,只明確允許特定角色執行特定功能」。
- 避免使用「預設允許,只拒絕特定角色」的黑名單模式,因為這樣很容易在新增功能時忘記加上新的限制。
3. 基於角色的存取控制 (Role-Based Access Control, RBAC)
- 為系統中的不同使用者群體定義清晰的角色(如
guest
,user
,editor
,admin
)。 - 為每個 API 端點或業務功能,明確標示需要哪個(或哪些)角色才能存取。
4. 伺服器端強制執行
- 切記,所有權限檢查必須在伺服器端強制執行。絕對不能依賴前端介面來隱藏或顯示功能作為安全措施,因為客戶端的一切都可以被輕易繞過。
說些什麼吧!