HTTPQL 與 StreamQL
Ogma 使用與 Caido 相容的查詢語言子集,篩選 HTTP 歷程記錄、WebSocket 流量、自動化結果及相關檢視。
語法
查詢由透過 AND 與 OR 連接的子句組成。
text
req.host:example.com AND resp.code:200括號可將運算式分組:
text
(req.path.cont:"/api/" OR req.path.cont:"/graphql") AND resp.code.gte:400支援註解:
text
// API errors
req.path.cont:"/api/" AND resp.code.gte:500text
/* focus on login */
req.path.cont:"login"運算子
| 運算子 | 意義 |
|---|---|
: | 等於或預設比對,依欄位類型而定 |
.eq: | 等於 |
.ne: | 不等於 |
.cont: | 包含,不區分大小寫 |
.ncont: | 不包含,不區分大小寫 |
.cs.cont: | 包含,區分大小寫 |
.cs.ncont: | 不包含,區分大小寫 |
.like: | 類 SQL 模式比對 |
.nlike: | 不符合類 SQL 模式 |
.regex: | 符合規則運算式 |
.nregex: | 不符合規則運算式 |
.lt: | 小於 |
.lte: | 小於或等於 |
.gt: | 大於 |
.gte: | 大於或等於 |
.exists | 標頭存在;使用 req.header["Name"].value.exists 或對應的回應形式 |
HTTP 範例
尋找 API 流量:
text
req.path.cont:"/api/"尋找伺服器錯誤:
text
resp.code.gte:500尋找大型回應:
text
resp.len.gt:100000尋找 JSON 回應:
text
resp.header["content-type"].value.cont:"application/json"尋找帶有 Cookie 的請求:
text
req.header["cookie"].value.exists尋找經由攔截或比對與取代功能修改的流量:
text
req.modified.eq:true尋找可能的管理路徑:
text
req.path.cont:"/admin" OR req.path.cont:"/manage"尋找重送或自動化流量:
text
source:replay OR source:automate串流範例
StreamQL 將相同的查詢方式套用到 WebSocket 與串流檢視。
尋找包含權杖欄位的 WebSocket 訊息:
text
ws.raw.cont:"token"尋找由伺服器傳送至用戶端的訊息:
text
ws.direction.eq:"To Client"尋找類似 JSON 的訊息:
text
ws.raw.cont:"{" AND ws.raw.cont:"}"實用的已儲存篩選條件
| 名稱 | 查詢 |
|---|---|
| API 錯誤 | req.path.cont:"/api/" AND resp.code.gte:400 |
| 身分驗證端點 | req.path.cont:"login" OR req.path.cont:"oauth" OR req.path.cont:"session" |
| JSON 流量 | resp.header["content-type"].value.cont:"json" |
| 值得留意的方法 | req.method:POST OR req.method:PUT OR req.method:PATCH OR req.method:DELETE |
| 潛在機密資訊 | resp.body.cont:"api_key" OR resp.body.cont:"secret" OR resp.body.cont:"token" |
限制
為了讓篩選行為可預期,Ogma 會限制查詢複雜度:
- 巢狀運算式深度上限:16。
- 子句數量上限:64。
如果查詢過於複雜,請拆分成已儲存的篩選條件,或使用搜尋進行更廣泛的調查。