HTTPQL и StreamQL
Ogma использует совместимое с Caido подмножество языка запросов для истории HTTP, WebSocket, результатов Automate и связанных разделов.
Синтаксис
Запросы состоят из условий, соединённых 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Найти трафик, изменённый Intercept или Match & Replace:
text
req.modified.eq:trueНайти вероятные административные пути:
text
req.path.cont:"/admin" OR req.path.cont:"/manage"Найти трафик Replay или Automate:
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.
Если запрос слишком сложный, разделите его на сохранённые фильтры или используйте поиск для более широкого исследования.