【AIS3】API 安全
API 安全
-中華資安國際 資安研究員 zodius
技術簡介
What is API?
- 點炒飯
- 跟廚師說一份炒飯
- 叫廚師打蛋切菜…
好處
把商業邏輯或業務邏輯封裝成簡單邏輯
- 本質:封裝
- 無需關注細節,專注自己業務邏輯
- 透過介面溝通,可同時開發
- 前後端邏輯分離,減少流量與資料相依性
API 發展
- RPC
- 跨電腦溝通, ex: 轉帳、查詢
- 隨 http 發展演變成 Web service
- 專注於特定任務
- SOAP 傳輸
- XML 格式協議
- WSDL 約定 interface
- web service
- 提供參數
- 缺點 - GetFile() 可能很多種定義
- 範圍混亂,如何拆分沒有統一標準
SOAP
- header - 方法
- body - 正式請求
Google hacking wsdl 可能可以找到很多酷東西
可從中獲得網站資訊
RESTful API
解決範圍定義問題
Header
- method
- GET
- POST
- PUT
- DELETE
- HEAD
- OPTIONS
- CONNECT
- TRACE
- URL
- version
- method
Representational State Transfer 狀態轉移
- 認為 API 最小單位是物件
沒有標準規範,是一種設計風格
動詞 -> 資源,解決範圍規範問題
Body 沒有規定,但通常是 JSON
OpenAPI
- 統一標準語法描述 RESTful API
- 可透過 swagger 產生文件頁面
n+1 problem
- 以資源為主體,複雜商業邏輯易造成 n+1 問題
GraphQL
- 2015 年由 Facebook 提出
- 類 SQL Query 查詢
|
|
grpc
- 2016 年由 Google 提出
- binary encode 減少封包體積
- HTTP 2 底層協議加速傳輸標準
microservice
- 把功能切成獨立的小 server
共同概念
- 身分驗證
- Session-based
- Session-Cookie
- 難以儲存使用者資訊
- microservice 太多 server 不知道存哪個
- Token-based
- Pre-shared token
- 問題:如何重簽 token、銷毀 token
- JWT
- Client-side
- 伺服器不需要儲存,減少資源使用量
- 使用者登入 -> Server 給 JWT token -> 下次帶 token 寫資料
- 簽章安全機制,防竄改
- Pre-shared token
- Client-side TLS(mTLS)
- TCP Connection(SYN, SYN/ACK, ACK) -> mTLS(簽章) -> 取得資料(不驗證)
- 保證兩邊都是正確的目的地,知道彼此是誰
- 確保只有經過驗證的人可以連線
- Session-based
安全檢測
OWASP API Top 10
- 四年更新一次,目前最新版是 2023 年
- API1:2023 - Broken Object Level Authorization
- 缺乏妥善權限檢查機制,導致攻擊者可透過修改物件 ID 直接存取資源
- 修改參數,如 GET /users/id=1 -> GET /users/id=2
- 修改 HTTP Method,如 GET -> POST
- API2:2023 - Broken Authentication
- 身分驗證瑕疵
- 使用者帳密/API Token 洩漏
- JWT Key 洩漏
- JWT Attack
- Key 暴力破解
- 竄改加密演算法
- 非對稱改對稱
- 竄改 kid
- 路徑遍歷
- 指向大家都知道的檔案 ex: wp-config
- Bypass ASLR
- JWT Attack
- 暴力破解
- 身分驗證瑕疵
- API3:2023 - Broken Object Property Level Authorization
- 未驗證物件屬性是否合法
- 資料外洩
- 查詢使用者,回傳包含明文密碼
- 竄改屬性
- 建立使用者時設定初始帳戶餘額
- 購物車修改金額
- API2:2023 vs API3:2023
- API2:2023 關注物件 id
- API3:2023 關注物件屬性
- API4:2023 - Unrestricted Resource Consumption
- 未限制存取頻率、次數限制
- DoS、資源消耗
- SMS 認證
- 瘋狂送簡訊,耗簡訊費
- graphql DoS
- 單一查詢加入大量條件
- SMS 認證
- API5:2023 - Broken Function Level Authorization
- API Endpoint 未驗證使用者權限
- 一般使用者呼叫管理 API
- 垂直權限跨越
- API6:2023 - Unrestricted Access To Sensitive Business Flows
- 未對敏感功能進行限制控管,攻擊者可以自動化方式影響業務流程
- 高鐵 API 自動訂票
- API7:2023 - Service Side Request Forgery
- 未驗證使用者參數,根據參數存取遠端資源
- GET /server-health?ip=…
- API8:2023 - Sercurity Misconfiguration
- 安全性組態設定錯誤
- CORS
- CSRF
- 瀏覽器發現圖片來自受害網站時,會發送請求詢問是否可以發送封包
Access-Control-Allow-Origin: * Access-Control-Allow-Origin: <origin> Access-Control-Allow-Origin: null
- API9:2023 - Improper Inventory Management
- 沒有妥善版本、文件管理
- 沒有人知道的 Shadow API
- 沒有人知道的 Shadow Parameters
- API10:2023 - Unsafe Consumption of APIs
- 開發人員通常信任 API 所回傳的資料
- API Server 被攻擊或竄改,會影響到所有使用者
共通檢測方式 - 參數探測
- 無法得知 API 參數通常無法順利與 Server 建立溝通
- API 文件洩漏
- WSDL
- RESTful SwaggerUI
- GraphQL
- 經常透過程式碼產生遺留在正式環境
- 常見路徑
- /graphql
- /graphiql/playground
- /graphiql/console
- Parameter Fuzzing
- ffuf
- 爆破工具
- 蒐集字典檔
- arjun
- schemathesis
- 壓力測試
- 匯入 open api 文件
- 對每個 api 端點做亂數 fuzzing 看 server 會不會崩潰
- ffuf
- API 文件洩漏