HTTPQL і StreamQL
Ogma використовує сумісну з Caido підмножину мови запитів для фільтрації історії HTTP, трафіку WebSocket, результатів автоматизації й пов’язаних розділів.
Синтаксис
Запити складаються з умов, поєднаних 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Знайти трафік, змінений перехопленням або пошуком і заміною:
text
req.modified.eq:trueЗнайти ймовірні адміністративні шляхи:
text
req.path.cont:"/admin" OR req.path.cont:"/manage"Знайти трафік повторного надсилання або автоматизації:
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.
Якщо запит надто складний, розділіть його на збережені фільтри або використовуйте пошук для ширшого дослідження.