HTTPQL dan StreamQL
Ogma menggunakan subset bahasa kueri yang kompatibel dengan Caido untuk memfilter riwayat HTTP, lalu lintas WebSocket, hasil Otomatisasi, dan tampilan terkait.
Sintaks
Kueri terdiri dari klausa yang dihubungkan dengan AND dan OR.
text
req.host:example.com AND resp.code:200Tanda kurung mengelompokkan ekspresi:
text
(req.path.cont:"/api/" OR req.path.cont:"/graphql") AND resp.code.gte:400Komentar didukung:
text
// API errors
req.path.cont:"/api/" AND resp.code.gte:500text
/* focus on login */
req.path.cont:"login"Operator
| Operator | Makna |
|---|---|
: | Sama dengan atau pencocokan default, bergantung pada tipe kolom |
.eq: | Sama dengan |
.ne: | Tidak sama dengan |
.cont: | Mengandung, tanpa membedakan huruf besar/kecil |
.ncont: | Tidak mengandung, tanpa membedakan huruf besar/kecil |
.cs.cont: | Mengandung, dengan membedakan huruf besar/kecil |
.cs.ncont: | Tidak mengandung, dengan membedakan huruf besar/kecil |
.like: | Pencocokan pola seperti SQL |
.nlike: | Pencocokan negatif pola seperti SQL |
.regex: | Pencocokan ekspresi reguler |
.nregex: | Pencocokan negatif ekspresi reguler |
.lt: | Lebih kecil dari |
.lte: | Lebih kecil dari atau sama dengan |
.gt: | Lebih besar dari |
.gte: | Lebih besar dari atau sama dengan |
.exists | Header ada; gunakan req.header["Name"].value.exists atau padanannya untuk respons |
Contoh HTTP
Temukan lalu lintas API:
text
req.path.cont:"/api/"Temukan kesalahan server:
text
resp.code.gte:500Temukan respons besar:
text
resp.len.gt:100000Temukan respons JSON:
text
resp.header["content-type"].value.cont:"application/json"Temukan permintaan dengan cookie:
text
req.header["cookie"].value.existsTemukan lalu lintas yang dimodifikasi oleh Intersepsi atau Cocokkan & Ganti:
text
req.modified.eq:trueTemukan path yang kemungkinan merupakan path admin:
text
req.path.cont:"/admin" OR req.path.cont:"/manage"Temukan lalu lintas kirim ulang atau otomatisasi:
text
source:replay OR source:automateContoh Stream
StreamQL menerapkan gaya kueri yang sama pada tampilan WebSocket dan stream.
Temukan pesan WebSocket yang mengandung kolom token:
text
ws.raw.cont:"token"Temukan pesan server-ke-klien:
text
ws.direction.eq:"To Client"Temukan pesan yang menyerupai JSON:
text
ws.raw.cont:"{" AND ws.raw.cont:"}"Filter Tersimpan Praktis
| Nama | Kueri |
|---|---|
| Kesalahan API | req.path.cont:"/api/" AND resp.code.gte:400 |
| Endpoint autentikasi | req.path.cont:"login" OR req.path.cont:"oauth" OR req.path.cont:"session" |
| Lalu lintas JSON | resp.header["content-type"].value.cont:"json" |
| Metode menarik | req.method:POST OR req.method:PUT OR req.method:PATCH OR req.method:DELETE |
| Potensi rahasia | resp.body.cont:"api_key" OR resp.body.cont:"secret" OR resp.body.cont:"token" |
Batas
Agar filter tetap dapat diprediksi, Ogma membatasi kompleksitas kueri:
- Kedalaman ekspresi bersarang maksimum: 16.
- Jumlah klausa maksimum: 64.
Jika kueri terlalu kompleks, pisahkan menjadi filter tersimpan atau gunakan Cari untuk investigasi lebih luas.