HTTPQL و StreamQL
Ogma برای فیلتر کردن تاریخچهٔ HTTP، ترافیک WebSocket، نتایج خودکارسازی و نماهای مرتبط، از زیرمجموعهای از یک زبان پرسوجوی سازگار با Caido استفاده میکند.
نحو
پرسوجوها از شرطهایی تشکیل میشوند که با 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.
اگر پرسوجو بیش از حد پیچیده شد، آن را به فیلترهای ذخیرهشده تقسیم کنید یا برای بررسی گستردهتر از جستوجو استفاده کنید.