OWASP Top 10 #1 漏洞
網頁安全實務課程
深入了解攻擊手法與防禦策略
存取控制是確保只有授權使用者才能存取特定資源的安全機制
Authentication
Authorization
Access Control
GET /profile?user_id=123GET /profile?user_id=456從第五名躍升至第一名
94% 的應用程式都有存取控制問題
可能導致完整的資料洩露
攻擊者不需要特殊工具
自動化工具難以發現邏輯缺陷
應用程式直接使用使用者提供的輸入來存取物件,而沒有進行適當的權限檢查。攻擊者可以透過修改參數值來存取其他使用者的資源。
GET /api/orders/12345Authorization: Bearer user_token
使用者查看自己的訂單
GET /api/orders/12346GET /api/orders/12347GET /api/orders/12348
嘗試存取其他人的訂單
POST /transferfrom_account=123&to_account=456&amount=1000
POST /transferfrom_account=999&to_account=456&amount=1000
↑ 修改來源帳戶,從他人帳戶轉帳
{ "user_id": 123, "role": "user", "action": "view_profile"}
{ "user_id": 123, "role": "admin", ← 提升權限 "action": "delete_user"}
攻擊者直接在 URL 輸入這些路徑嘗試存取
POST /api/admin/delete-userPOST /api/admin/change-permissionsGET /api/admin/all-users
GET /api/users/delete/123 ← 繞過 DELETE 限制PUT /api/users/123/role/admin ← 直接修改角色
2018年爆發,影響 8700 萬用戶
2020年發現,IDOR 漏洞導致客戶資料外洩風險
攻擊者使用自己的帳號正常登入銀行 APP
使用 Burp Suite 攔截 API 請求,發現帳戶 ID 參數
將帳戶 ID 修改為其他數字,嘗試存取他人資料
成功獲取其他客戶的帳戶餘額和交易記錄
GET /api/account/balanceHeaders: Authorization: Bearer user_token Account-ID: 1234567890
GET /api/account/balanceHeaders: Authorization: Bearer user_token Account-ID: 1234567891 ← 他人帳戶
個人隱私、商業機密、客戶資料完全暴露
未授權交易、資金盜用、虛假轉帳
個資被惡意使用、偽造身份、信用詐騙
惡意修改、資料刪除、系統癱瘓
違反個資法、GDPR、資安法等法規
客戶信任度下降、品牌形象受損
系統停機修復、業務流程中斷
商業資訊外洩、市場地位下降
敏感資料可能完全暴露給未授權人員
資料可能被惡意修改或刪除
可能導致服務中斷或效能下降
違反個資蒐集、處理、利用規定
未依規定通報資安事件
個資外洩造成當事人損害
修改 ID、token 等參數值,測試是否能存取他人資料
使用低權限帳號測試高權限功能和頁面
嘗試存取管理頁面和隱藏的 API 端點
嘗試不同的 HTTP 動詞繞過權限檢查
除非明確允許,否則拒絕所有存取請求
建立多層次的安全控制機制
只給予完成工作所需的最小權限
即時偵測和回應異常行為
// 前端 JavaScript - 容易被繞過if (user.role === 'admin') { showAdminPanel(); // 直接呼叫 API,沒有後端驗證 fetch('/api/delete-user/' + userId);}
// 後端 API - 每次都驗證權限app.delete('/api/delete-user/:id', (req, res) => { // 1. 驗證使用者身份 const user = authenticateToken(req.headers.authorization); // 2. 檢查權限 if (!user || user.role !== 'admin') { return res.status(403).json({error: 'Forbidden'}); } // 3. 執行操作 deleteUser(req.params.id); res.json({success: true});});
/api/orders/1/api/orders/2/api/orders/3# 容易被枚舉攻擊
/api/orders/a7b9c2d4-e5f6-7890/api/orders/x1y2z3w4-m5n6-p7q8/api/orders/k9l8m7n6-p5q4-r3s2# 使用 UUID 或隨機 ID
// 檢查使用者是否擁有該資源app.get('/api/orders/:id', (req, res) => { const user = authenticateUser(req); const order = getOrder(req.params.id); // 關鍵:檢查擁有權 if (order.userId !== user.id && user.role !== 'admin') { return res.status(403).json({error: 'Access denied'}); } res.json(order);});
* 只能修改自己的資料
Damn Vulnerable Web Application
現代化的漏洞練習平台
線上安全實驗室
影響廣泛且危害嚴重,可能導致完整的資料洩露
攻擊者不需要特殊工具,容易利用但難以檢測
永遠不要相信客戶端的權限資訊
只給予完成工作所需的最小權限
有任何問題歡迎討論