API 攻擊面分析

API 的六大攻擊面

1. 端點發現 → 找出隱藏 API
2. 認證繞過 → 繞過 JWT / API Key
3. 授權缺陷 → IDOR、水平/垂直提權
4. 輸入驗證 → SQLi、NoSQLi、Command Injection
5. 速率限制 → 暴力破解、DDoS
6. 資訊洩露 → 錯誤訊息、回應過多資料

Vibe Prompt

「幫我建立一個 API 安全掃描腳本:測試目標 API 的认证繞過、IDOR、SQL Injection。」

import requests

class APIScanner:
    def __init__(self, base_url):
        self.base_url = base_url
        self.results = []
    
    def test_idor(self, endpoint, auth_token):
        """測試 IDOR 漏洞"""
        headers = {"Authorization": f"Bearer {auth_token}"}
        
        # 嘗試存取其他用戶的資源
        for user_id in [1, 2, 3, 100, 999]:
            r = requests.get(f"{self.base_url}{endpoint}/{user_id}", headers=headers)
            if r.status_code == 200:
                self.results.append({
                    "type": "IDOR",
                    "endpoint": f"{endpoint}/{user_id}",
                    "status": r.status_code,
                    "risk": "高" if user_id != 1 else "低"
                })
    
    def test_sqli(self, endpoint):
        """測試 SQL Injection"""
        payloads = ["'", "\"", "' OR '1'='1", "' UNION SELECT * FROM users--"]
        for payload in payloads:
            r = requests.get(f"{self.base_url}{endpoint}?id={payload}")
            if any(err in r.text.lower() for err in ["sql", "syntax", "mysql", "unexpected"]):
                self.results.append({
                    "type": "SQL Injection",
                    "payload": payload,
                    "status": r.status_code,
                    "risk": "嚴重"
                })
    
    def run(self):
        print(f"掃描目標: {self.base_url}")
        self.test_idor("/api/users", "test_token_123")
        self.test_sqli("/api/search")
        
        if self.results:
            print(f"\n發現 {len(self.results)} 個漏洞!")
            for r in self.results:
                print(f"  [{r['risk']}] {r['type']}: {r.get('endpoint', r.get('payload', ''))}")
        else:
            print("\n未發現明顯漏洞")

scanner = APIScanner("http://test-server.com")
scanner.run()

關鍵要點

  • ✅ API Attack Surface = API 暴露的所有端點與資料
  • ✅ 常見攻擊面:REST 端點、GraphQL 查詢、WebSocket、檔案上傳、認證端點
  • ✅ 攻擊面越大,被攻擊的風險越高
  • ✅ 減少攻擊面策略:關閉不必要的端點、使用 API Gateway、速率限制

常見 API 漏洞分類

| 類別 | 風險 | 典型案例 | |------|:----:|---------| | BOLA (IDOR) | 高 | 修改 ID 存取他人資料 | | 認證缺陷 | 高 | JWT 未驗證、密碼暴力破解 | | 過度資料暴露 | 中 | API 回傳密碼雜湊 | | 速率限制不足 | 中 | 無限制的暴力破解 | | 批量分配 | 中 | 修改不該修改的欄位 |

常見錯誤

程式碼範例



API 攻擊面:從哪裡開始測試?

API 滲透測試的第一步是了解 API 的攻擊面——有哪些端點、哪些參數、哪些認證方式。

API 攻擊面分類

| 攻擊面 | 需要檢查 | |:------|:--------| | 認證 | JWT 簽章驗證?API Key 強度?OAuth redirect URI? | | 授權 | IDOR?Role escalation?Admin 功能是否保護? | | 輸入驗證 | SQL/NoSQL Injection?SSRF?XXE? | | 配置 | CORS 太寬鬆?除錯端點未關閉?HTTPS 未強制? | | 商業邏輯 | 訂單金額可被修改?折扣可疊加? |

資訊收集工具

  • Swagger/OpenAPI:找 /docs/swagger.json/openapi.json
  • 目錄爆破ffuf -w wordlist.txt -u https://api.target.com/FUZZ
  • 歷史 API 探索:Google Dork site:target.com "api" "swagger"

下一章預告:JWT 安全漏洞

找到 API 端點後,下一步測試認證——JWT 是最常見的 API 認證方式,也是最容易被實作錯誤的地方。

會員專屬免費教學

本章節為註冊會員專屬的免費開放內容!請先登入或註冊會員,即可立即解鎖閱讀。

立即登入 / 註冊