AI API 列舉
透過系統性列舉技術發現 AI API 端點、參數、模型設定與未記錄的功能。
AI API 列舉
AI API 列舉 是繪製 AI API 完整面向的過程。除了官方文件中呈現的已記錄端點之外,AI API 常暴露未記錄的參數、替代模型版本、除錯模式與設定選項,這些擴大了攻擊面。系統性列舉揭露這些隱藏能力於利用開始之前。
端點發現
常見 AI API 端點模式
AI API 遵循可預測模式,引導列舉:
class AIAPIEnumerator:
"""Systematically enumerate AI API endpoints."""
COMMON_PATHS = [
# Chat/completion endpoints
"/v1/chat/completions",
"/v1/completions",
"/v2/chat/completions",
"/api/generate",
"/api/chat",
"/inference",
# Model management
"/v1/models",
"/v1/models/{model_id}",
"/api/models",
# Embeddings
"/v1/embeddings",
"/api/embed",
# Fine-tuning
"/v1/fine-tuning/jobs",
"/v1/fine_tunes",
# Files and data
"/v1/files",
"/v1/uploads",
# Moderation and safety
"/v1/moderations",
"/api/safety",
"/api/content-filter",
# Admin and config
"/v1/usage",
"/v1/billing",
"/health",
"/status",
"/debug",
"/metrics",
"/admin",
]
def enumerate_endpoints(self, base_url, auth_headers=None):
"""Probe for all common endpoints."""
discovered = []
for path in self.COMMON_PATHS:
url = f"{base_url}{path}"
try:
response = requests.get(url, headers=auth_headers, timeout=10)
discovered.append({
"path": path,
"status": response.status_code,
"content_type": response.headers.get("Content-Type"),
"response_size": len(response.content),
"interesting": response.status_code not in [404, 403]
})
except requests.RequestException as e:
discovered.append({"path": path, "error": str(e)})
return [d for d in discovered if d.get("interesting", False)]模型列表與版本發現
探測標準模型列表端點(/v1/models)以取得可用模型清單;然後以常見模型名稱(gpt-4、gpt-4-turbo、claude-3-opus/sonnet/haiku、gemini-pro/ultra、llama-3-70b/8b、mistral-7b、mixtral-8x7b 等)對 /v1/chat/completions 發送小型請求。狀態碼 200 代表可用;400 加「model not found」則模型名稱被辨識但未授權——仍提供有價值資訊(模型存在於系統中)。
參數發現
未記錄的參數
AI API 常接受未列於文件的參數。列舉方法:以已知可運作的基礎請求為起點,逐一加入候選參數並觀察回應。候選清單應涵蓋:
- 生成參數:
temperature(0-2.0)、top_p(0.1-0.9)、top_k(1-50)、frequency_penalty、presence_penalty、repetition_penalty、max_tokens、n、best_of - 輸出格式參數:
response_format(json_object/text)、logprobs、top_logprobs、echo、stream - 隱藏/除錯參數:
debug、verbose、raw、include_usage、include_metadata、return_prompt、show_system - 安全參數:
safe_mode、content_filter(off/low/medium/high)、moderation
若 200 代表參數被接受;若 400 加「not a valid」則參數名被辨識但值無效——仍證實此參數為 API 所知。
錯誤訊息分析
錯誤訊息常揭露內部系統細節。觸發條件包括:
- 類型錯誤:
messages傳字串而非陣列、傳無效role、不存在的model名稱、負數或超大max_tokens、超範圍temperature - 邊緣情況:空
messages陣列、空物件、缺少content欄位 - 溢位:極長內容(1M 字元)
分析錯誤回應中是否揭露:版本資訊、堆疊追蹤/traceback、框架辨識字串(Flask、FastAPI、Django、Express)、可用模型清單(「available models: ...」)、資料庫技術名稱(Postgres、MySQL、Redis、Mongo)。
速率限制繪製
對端點持續送相同基礎請求直至收到 429(Rate Limited);於過程中檢查所有 rate-*、limit-* 標頭、Retry-After 標頭。以達 429 前的請求數與經過時間換算「requests per minute」。類似手法可得知 tokens_per_minute、requests_per_day。
認證分析
測試未認證存取(GET /v1/models 不帶 header)——若成功則記錄為未認證端點。測試各式認證方法:
- Bearer token:
Authorization: Bearer <key> - API key header:
x-api-key: <key> - Basic auth:
Authorization: Basic <base64> - Query string:
?api_key=<key>
於各方法使用無效金鑰觀察錯誤碼與錯誤訊息——401 通常指示此認證類型受支援但金鑰無效;403 指示金鑰有效但權限不足;404 指示端點不存在。錯誤訊息內容可進一步揭露金鑰格式要求。
列舉報告
將列舉結果編纂為可行動報告:
- 摘要:發現的端點數、可用模型數、未記錄參數數、資訊揭露數
- 攻擊面優先順序:
- 高優先:未認證端點、管理/除錯/指標端點、揭露憑證或內部 IP 的錯誤訊息
- 中優先:未記錄但被接受的參數(特別是安全/過濾相關)、自定內部模型名稱、揭露框架/資料庫的錯誤
- 低優先:已記錄的端點、預期的錯誤行為、已公開的模型名稱
相關主題
參考文獻
- OWASP, "API Security Top 10" (2023)
- OWASP, "Web Application Testing Guide" (2023)
- Burp Suite, "API Testing Methodology" (2023)