HTTPQL y StreamQL
Ogma utiliza un subconjunto del lenguaje de consultas compatible con Caido para filtrar el historial HTTP, el tráfico WebSocket, los resultados de Automatización y las vistas relacionadas.
Sintaxis
Las consultas se componen de cláusulas unidas mediante AND y OR.
text
req.host:example.com AND resp.code:200Los paréntesis agrupan expresiones:
text
(req.path.cont:"/api/" OR req.path.cont:"/graphql") AND resp.code.gte:400Se admiten comentarios:
text
// API errors
req.path.cont:"/api/" AND resp.code.gte:500text
/* focus on login */
req.path.cont:"login"Operadores
| Operador | Significado |
|---|---|
: | Igualdad o coincidencia predeterminada, según el tipo de campo |
.eq: | Igual a |
.ne: | Distinto de |
.cont: | Contiene, sin distinguir mayúsculas y minúsculas |
.ncont: | No contiene, sin distinguir mayúsculas y minúsculas |
.cs.cont: | Contiene, distinguiendo mayúsculas y minúsculas |
.cs.ncont: | No contiene, distinguiendo mayúsculas y minúsculas |
.like: | Coincidencia de patrón de tipo SQL |
.nlike: | Ausencia de coincidencia de patrón de tipo SQL |
.regex: | Coincidencia de expresión regular |
.nregex: | Ausencia de coincidencia de expresión regular |
.lt: | Menor que |
.lte: | Menor o igual que |
.gt: | Mayor que |
.gte: | Mayor o igual que |
.exists | La cabecera existe; usa req.header["Name"].value.exists o su equivalente para la respuesta |
Ejemplos HTTP
Buscar tráfico de API:
text
req.path.cont:"/api/"Buscar errores del servidor:
text
resp.code.gte:500Buscar respuestas grandes:
text
resp.len.gt:100000Buscar respuestas JSON:
text
resp.header["content-type"].value.cont:"application/json"Buscar solicitudes con cookies:
text
req.header["cookie"].value.existsBuscar tráfico modificado por Intercepción o Buscar y reemplazar:
text
req.modified.eq:trueBuscar posibles rutas de administración:
text
req.path.cont:"/admin" OR req.path.cont:"/manage"Buscar tráfico de repetición de solicitudes o automatización:
text
source:replay OR source:automateEjemplos de streaming
StreamQL aplica el mismo estilo de consultas a las vistas de WebSocket y de streaming.
Buscar mensajes WebSocket que contengan un campo de token:
text
ws.raw.cont:"token"Buscar mensajes del servidor al cliente:
text
ws.direction.eq:"To Client"Buscar mensajes con apariencia de JSON:
text
ws.raw.cont:"{" AND ws.raw.cont:"}"Filtros guardados prácticos
| Nombre | Consulta |
|---|---|
| Errores de API | req.path.cont:"/api/" AND resp.code.gte:400 |
| Endpoints de autenticación | req.path.cont:"login" OR req.path.cont:"oauth" OR req.path.cont:"session" |
| Tráfico JSON | resp.header["content-type"].value.cont:"json" |
| Métodos de interés | req.method:POST OR req.method:PUT OR req.method:PATCH OR req.method:DELETE |
| Posibles secretos | resp.body.cont:"api_key" OR resp.body.cont:"secret" OR resp.body.cont:"token" |
Límites
Para que los filtros sean predecibles, Ogma limita la complejidad de las consultas:
- Profundidad máxima de anidamiento de expresiones: 16.
- Número máximo de cláusulas: 64.
Si una consulta resulta demasiado compleja, divídela en filtros guardados o utiliza la búsqueda para realizar una investigación más amplia.