這個月我們已經聊了這麼多關於 Web 應用程式的具體漏洞和測試工具,我想延伸一個在當今架構下變得越來越核心,卻也常常被誤解的安全議題——API 安全 (API Security)。
我們可以說,如果傳統的網站安全是在保護「城堡的大門」,那麼 API 安全就是在保護城堡內部成千上萬個房間的「房門」以及它們之間的「秘密通道」。
在過去,網站大多是「單體式應用 (Monolithic Application)」,也就是前端的 HTML 頁面和後端的業務邏輯是緊密耦合在一起的,由伺服器統一渲染後傳送給瀏覽器。
但現在的趨勢完全不同了:
結論就是:API 已經成為了現代數位世界的「神經系統」。 過去被層層保護在後端的業務邏輯,現在都必須透過 API 端點 (Endpoints) 暴露出來。這意味著,攻擊面 (Attack Surface) 大大增加了,過去許多不存在的攻擊向量也隨之誕生。
傳統網站安全很多時候圍繞著 Cookie 和 Session 來做防護。但在 API 的世界裡,通訊往往是無狀態的 (Stateless)。客戶端(例如手機 App)在每一次請求中,都必須提供自己的身份證明。
這個「身份證明」通常就是 API 金鑰 (API Keys) 或更常見的 JWT (JSON Web Tokens)。這就帶來了新的安全問題:
就像 Web 應用有 OWASP Top 10 一樣,API 安全也有自己的一套十大風險。我挑選其中幾個最具代表性的來說明,你會發現它和傳統 Web 漏洞的思維有何不同。
這是最常見且最致命的 API 漏洞,沒有之一。它本質上是傳統 IDOR (不安全的直接物件引用) 漏洞在 API 中的體現。
核心問題:API 端點雖然驗證了使用者是否登入 (Authentication),卻沒有驗證該使用者是否有權限操作其請求的物件 (Authorization)。
範例:
假設有一個 API 端點可以獲取使用者的個人資料:GET /api/v1/users/{userId}/profile
123
)登入後,你的 App 會呼叫 GET /api/v1/users/123/profile
來獲取你自己的資料,這很正常。GET /api/v1/users/456/profile
。123
)是否有權限查看使用者 456
的資料」,它就會直接將使用者 456
的個人資料回傳給你。這類漏洞極其普遍,因為開發者很容易在業務邏輯中遺漏對每一個物件的存取權限檢查。
如果說 BOLA 是「你能否操作不屬於你的東西」,那麼 BFLA 就是「你能否執行不屬於你角色的動作」。
核心問題:API 沒有對不同的使用者角色(例如 普通使用者
vs 管理員
)進行嚴格的功能級別權限區分。
範例:
POST /api/posts/new
(新增文章)DELETE /api/posts/{postId}/delete
(刪除文章)一個攻擊者雖然是以普通使用者的身份登入,但他可以猜測或透過其他方式得知存在一個管理員的 API 端點。如果他直接嘗試呼叫 DELETE /api/posts/999/delete
,而伺服器沒有在執行這個功能前,嚴格驗證呼叫者的角色是否為 admin
,那麼這個刪除操作就會被成功執行。
這個漏洞更為細緻,它涉及到對物件內部屬性的存取控制。
password_hash
, permission_level
等內部欄位)從資料庫中撈出來,然後直接序列化成 JSON 回傳給前端。即使前端介面沒有顯示這些敏感欄位,攻擊者也可以透過攔截 API 回應來看到所有資訊。PUT /api/users/me
,Body: {"nickname": "New Name"}
PUT /api/users/me
,Body: {"nickname": "New Name", "is_admin": true}
API 的普及徹底改變了應用程式的架構,也改變了攻擊者的思維。防禦方不能再僅僅依賴於網路防火牆或 WAF,因為合法的 API 流量看起來都差不多。
安全必須左移 (Shift Left),在 API 設計和開發的階段就融入安全思維:
API 安全是一個龐大且持續演進的領域,它要求開發者和資安人員都必須更新自己的知識庫,去理解這個由無數端點構成的、高度互聯的新戰場。