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:100000JSON 응답 찾기:
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.
쿼리가 너무 복잡해지면 저장 필터로 나누거나 검색을 사용해 더 넓은 범위를 조사하세요.