HTTPQL en StreamQL
Ogma gebruikt een subset van een Caido-compatibele querytaal om de HTTP-geschiedenis, WebSocket-verkeer, resultaten van Automatiseren en gerelateerde weergaven te filteren.
Syntaxis
Query's bestaan uit clausules die met AND en OR zijn verbonden.
text
req.host:example.com AND resp.code:200Haakjes groeperen expressies:
text
(req.path.cont:"/api/" OR req.path.cont:"/graphql") AND resp.code.gte:400Commentaar wordt ondersteund:
text
// API errors
req.path.cont:"/api/" AND resp.code.gte:500text
/* focus on login */
req.path.cont:"login"Operatoren
| Operator | Betekenis |
|---|---|
: | Gelijk aan of standaardvergelijking, afhankelijk van het veldtype |
.eq: | Gelijk aan |
.ne: | Niet gelijk aan |
.cont: | Bevat, niet hoofdlettergevoelig |
.ncont: | Bevat niet, niet hoofdlettergevoelig |
.cs.cont: | Bevat, hoofdlettergevoelig |
.cs.ncont: | Bevat niet, hoofdlettergevoelig |
.like: | Vergelijking met een SQL-achtig patroon |
.nlike: | Negatieve vergelijking met een SQL-achtig patroon |
.regex: | Vergelijking met een reguliere expressie |
.nregex: | Negatieve vergelijking met een reguliere expressie |
.lt: | Kleiner dan |
.lte: | Kleiner dan of gelijk aan |
.gt: | Groter dan |
.gte: | Groter dan of gelijk aan |
.exists | Header bestaat; gebruik req.header["Name"].value.exists of het equivalent voor de respons |
HTTP-voorbeelden
Zoek API-verkeer:
text
req.path.cont:"/api/"Zoek serverfouten:
text
resp.code.gte:500Zoek grote responses:
text
resp.len.gt:100000Zoek JSON-responses:
text
resp.header["content-type"].value.cont:"application/json"Zoek verzoeken met cookies:
text
req.header["cookie"].value.existsZoek verkeer dat is gewijzigd door Interceptie of Zoeken en vervangen:
text
req.modified.eq:trueZoek paden die waarschijnlijk voor beheer dienen:
text
req.path.cont:"/admin" OR req.path.cont:"/manage"Zoek verkeer uit Opnieuw versturen of Automatiseren:
text
source:replay OR source:automateStreamvoorbeelden
StreamQL past dezelfde querystijl toe op WebSocket- en streamweergaven.
Zoek WebSocket-berichten die een tokenveld bevatten:
text
ws.raw.cont:"token"Zoek berichten van server naar client:
text
ws.direction.eq:"To Client"Zoek JSON-achtige berichten:
text
ws.raw.cont:"{" AND ws.raw.cont:"}"Praktische opgeslagen filters
| Naam | Query |
|---|---|
| API-fouten | req.path.cont:"/api/" AND resp.code.gte:400 |
| Authenticatie-eindpunten | req.path.cont:"login" OR req.path.cont:"oauth" OR req.path.cont:"session" |
| JSON-verkeer | resp.header["content-type"].value.cont:"json" |
| Interessante methoden | req.method:POST OR req.method:PUT OR req.method:PATCH OR req.method:DELETE |
| Mogelijke geheimen | resp.body.cont:"api_key" OR resp.body.cont:"secret" OR resp.body.cont:"token" |
Limieten
Om filters voorspelbaar te houden, beperkt Ogma de complexiteit van query's:
- Maximale nestingsdiepte van expressies: 16.
- Maximaal aantal clausules: 64.
Als een query te complex wordt, splits deze dan op in opgeslagen filters of gebruik Zoeken voor breder onderzoek.