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"ค้นหาคำขอที่มีคุกกี้:
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
หากคำค้นซับซ้อนเกินไป ให้แยกเป็นตัวกรองที่บันทึกไว้ หรือใช้ ค้นหา เพื่อสืบค้นในขอบเขตที่กว้างขึ้น