HTTPQL et StreamQL
Ogma utilise un sous-ensemble d'un langage de requête compatible avec Caido pour filtrer l'historique HTTP, le trafic WebSocket, les résultats d'Automatisation et les vues associées.
Syntaxe
Les requêtes sont composées de clauses reliées par AND et OR.
text
req.host:example.com AND resp.code:200Les parenthèses regroupent les expressions :
text
(req.path.cont:"/api/" OR req.path.cont:"/graphql") AND resp.code.gte:400Les commentaires sont pris en charge :
text
// API errors
req.path.cont:"/api/" AND resp.code.gte:500text
/* focus on login */
req.path.cont:"login"Opérateurs
| Opérateur | Signification |
|---|---|
: | Égalité ou correspondance par défaut, selon le type du champ |
.eq: | Égal à |
.ne: | Différent de |
.cont: | Contient, sans distinction de casse |
.ncont: | Ne contient pas, sans distinction de casse |
.cs.cont: | Contient, avec distinction de casse |
.cs.ncont: | Ne contient pas, avec distinction de casse |
.like: | Correspondance avec un motif de type SQL |
.nlike: | Absence de correspondance avec un motif de type SQL |
.regex: | Correspondance avec une expression régulière |
.nregex: | Absence de correspondance avec une expression régulière |
.lt: | Inférieur à |
.lte: | Inférieur ou égal à |
.gt: | Supérieur à |
.gte: | Supérieur ou égal à |
.exists | L'en-tête existe ; utilisez req.header["Name"].value.exists ou son équivalent pour la réponse |
Exemples HTTP
Trouver le trafic d'API :
text
req.path.cont:"/api/"Trouver les erreurs serveur :
text
resp.code.gte:500Trouver les réponses volumineuses :
text
resp.len.gt:100000Trouver les réponses JSON :
text
resp.header["content-type"].value.cont:"application/json"Trouver les requêtes contenant des cookies :
text
req.header["cookie"].value.existsTrouver le trafic modifié par Interception ou Rechercher et remplacer :
text
req.modified.eq:trueTrouver les chemins susceptibles de mener à une interface d'administration :
text
req.path.cont:"/admin" OR req.path.cont:"/manage"Trouver le trafic de Rejeu ou d'Automatisation :
text
source:replay OR source:automateExemples de flux
StreamQL applique le même style de requête aux vues WebSocket et aux vues de flux.
Trouver les messages WebSocket contenant un champ de jeton :
text
ws.raw.cont:"token"Trouver les messages envoyés du serveur au client :
text
ws.direction.eq:"To Client"Trouver les messages ressemblant à du JSON :
text
ws.raw.cont:"{" AND ws.raw.cont:"}"Filtres enregistrés utiles
| Nom | Requête |
|---|---|
| Erreurs d'API | req.path.cont:"/api/" AND resp.code.gte:400 |
| Points d'accès d'authentification | req.path.cont:"login" OR req.path.cont:"oauth" OR req.path.cont:"session" |
| Trafic JSON | resp.header["content-type"].value.cont:"json" |
| Méthodes intéressantes | req.method:POST OR req.method:PUT OR req.method:PATCH OR req.method:DELETE |
| Secrets potentiels | resp.body.cont:"api_key" OR resp.body.cont:"secret" OR resp.body.cont:"token" |
Limites
Pour conserver un comportement prévisible des filtres, Ogma limite la complexité des requêtes :
- Profondeur maximale des expressions imbriquées : 16.
- Nombre maximal de clauses : 64.
Si une requête devient trop complexe, répartissez-la entre plusieurs filtres enregistrés ou utilisez Recherche pour une investigation plus large.