Aller au contenu

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:200

Les parenthèses regroupent les expressions :

text
(req.path.cont:"/api/" OR req.path.cont:"/graphql") AND resp.code.gte:400

Les commentaires sont pris en charge :

text
// API errors
req.path.cont:"/api/" AND resp.code.gte:500
text
/* focus on login */
req.path.cont:"login"

Opérateurs ​

OpérateurSignification
:É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 à
.existsL'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:500

Trouver les réponses volumineuses :

text
resp.len.gt:100000

Trouver 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.exists

Trouver le trafic modifié par Interception ou Rechercher et remplacer :

text
req.modified.eq:true

Trouver 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:automate

Exemples 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 ​

NomRequête
Erreurs d'APIreq.path.cont:"/api/" AND resp.code.gte:400
Points d'accès d'authentificationreq.path.cont:"login" OR req.path.cont:"oauth" OR req.path.cont:"session"
Trafic JSONresp.header["content-type"].value.cont:"json"
Méthodes intéressantesreq.method:POST OR req.method:PUT OR req.method:PATCH OR req.method:DELETE
Secrets potentielsresp.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.

Logiciel propriétaire. Tous droits réservés.