Caido 워크플로
Dalfox는 Caido 워크플로 안에서 잘 작동합니다. 관심 있는 모든 요청(이나 선택한 트래픽)을 Dalfox 엔진에 곧바로 넣고, 탐지 결과를 클릭 한 번으로 Caido Findings로 전환할 수 있습니다.
이 페이지는 현재 권장 패턴(v3)과 워크플로 작성자를 곤란하게 만드는 흔한 "bool 함정"을 다룹니다.
핵심 패턴
Caido Workflows는 셸 단계를 실행할 수 있습니다. 이 단계는 현재 요청을(보통 JSON으로) stdin으로 받습니다. 원시 HTTP를 추출하여 --input-type raw-http로 Dalfox에 넘긴 다음, Finding을 생성할지 결정합니다.
최소 워크플로 단계 (bash/zsh)
#!/bin/bash
set -euo pipefail
DALFOX="${DALFOX_PATH:-/usr/local/bin/dalfox}"
# Caido usually sends { "request": "<raw HTTP>", ... }
RAW=$(cat - | jq -r '.request // .raw // .data.request // empty')
if [[ -z "$RAW" ]]; then
echo "No request payload" >&2
exit 0
fi
# raw-http reads a regular file (not stdin or a process substitution),
# so write the request to a temp file first.
TMP=$(mktemp)
trap 'rm -f "$TMP"' EXIT
printf '%s' "$RAW" > "$TMP"
# Run Dalfox (tune flags to taste) and capture its stdout.
# Dalfox exits 1 when it has findings, so capture the status with `|| FOUND=$?`
# instead of letting `set -e` abort the script on the case we care about.
FOUND=0
OUT=$("$DALFOX" scan --input-type raw-http "$TMP" \
-S \
--no-color \
--poc-type curl \
--timeout 8) || FOUND=$?
# Exit codes: 0 = clean, 1 = findings, 2 = error (bad input, unreachable
# target, or too many requests lost for the scan to count as clean)
if [[ $FOUND -eq 1 ]]; then
# Caido If/Else: the PoC lines are not a truthy string -> "False" branch
printf '%s\n' "$OUT"
else
# An error is not a clean result; leave a trace in the workflow log
if [[ $FOUND -ne 0 ]]; then echo "dalfox failed (exit $FOUND)" >&2; fi
# Emit exactly one truthy token so Caido treats it as "no finding"
echo "1"
fi
Caido 불리언 함정 (중요)
Caido의 Workflow If/Else 노드는 자체 bool 규칙을 사용하여 단계 출력을 평가합니다. 사람(이나 일반적인 셸)에게 "참 같아 보이는" 많은 문자열이 Caido 내부에서는 false가 됩니다.
신뢰할 수 있는 커뮤니티 패턴(이 댓글의 @m4dni5가 공유):
- 탐지 결과가 있을 때는 실제 Dalfox 출력(이나 비어 있지 않은 마커)을 내보냅니다. Caido는 이를 "False" 분기로 봅니다.
- 깨끗할 때는
1이나true같은 단순한 참 토큰을 명시적으로 내보냅니다. 이는 "True" 분기로 갑니다.
그런 다음 이렇게 연결합니다:
False→ Create FindingTrue→ (선택) Set Color / Tag / Continue
그래서 위 스크립트는 Dalfox의 stdout을 변수에 담아 두었다가 탐지 경로에서만
출력합니다. 깨끗한 경로에서는 단계의 출력 전체가 1 한 토큰뿐입니다.
Caido 권장 플래그
| 플래그 | 이유 |
|---|---|
-S / --silence |
POC / 탐지 결과 라인만 stdout으로 나갑니다 (Caido 로그의 노이즈 감소) |
--no-color |
탐지 결과, 검색, 내보내기를 위한 깔끔한 텍스트 (커뮤니티 워크플로 예시에서 제안됨) |
--poc-type curl (또는 httpie, http-request) |
Caido Finding에서 바로 사용할 수 있는 재현 코드 |
--timeout 6-10 |
요청별 예산; 워크플로를 빠르게 유지 |
--waf-bypass auto |
이미 기본값입니다. 트래픽이 프록시를 거친다고 off로 끌 필요는 없습니다 |
Finding 증거에 전체 마크다운 보고서를 담고 싶다면 -f markdown을 추가할 수도 있습니다.
silence 참고: -S는 로그를 억제하지만, 탐지 결과가 있으면 PoC 라인은
여전히 stdout으로 나가고, 깨끗한 실행에서도 빈 줄 하나는 출력됩니다. 이 빈 줄
하나만으로도 1이 Caido가 true로 읽지 않는 값이 되어 버립니다. 스크립트가
Dalfox 출력을 단계 결과로 그대로 흘려보내지 않고 변수에 담는 이유입니다.
전체 예시: If/Else + Create Finding
일반적인 Caido 워크플로 그래프:
- Trigger (Manual / Proxy / Intercept / Scope filter)
- Shell / Execute 단계에서 위 스크립트를 실행 → 출력이
$RESULT에 저장됨 - If/Else
- 조건: 이전 단계 출력이 거짓 / "False" 경로
- False 분기 (탐지): Create Finding
- 제목:
XSS via Dalfox - 요청: 원본
- 증거 / 설명:
$RESULT(또는 PoC 라인) - 심각도: 규칙에 따라 High / Medium
- 제목:
- True 분기 (깨끗): Set Color(녹색)나 Add Tag
dalfox-clean
호스트, 메서드, 파라미터 이름 같은 Caido의 컨텍스트를 Finding에 더 담을 수도 있습니다.
대안: 파일 단계 먼저 사용하기
일부 작성자는 두 단계를 선호합니다:
- 원시 요청을 임시 파일에 씁니다 (Caido에는 파일 시스템 노드가 있거나 셸에서 할 수 있습니다).
dalfox scan --input-type raw-http /path/to/req.txt ...를 실행합니다
이 방식은 워크플로 그래프에 단계가 하나 더 생기지만 디버그하기는 더 쉽습니다.
팁 및 함정
- 바이너리 위치: Caido의 PATH에는 brew, asdf, linuxbrew가 포함되지 않을 수 있습니다. 전체 경로를 사용하거나 워크플로 / Caido 설정에서
DALFOX_PATH환경 변수를 설정하고$DALFOX_PATH를 참조하세요. - 성능: 트래픽이 많을 때는 Dalfox 단계 앞에 Content-Type이나 스코프 내 필터를 추가하세요. Dalfox는 빠르지만 모든 이미지/스타일시트를 스캔할 필요는 없습니다.
- Blind XSS: Caido가 구동하는 트래픽에서 대역 외(out-of-band) 탐지를 원할 때
--blind https://your.collaborator/를 추가하세요. - DOM XSS: 기본 설정으로 바로 작동합니다 (AST 분석이 응답에서 실행됩니다).
- JSON 출력: 이후 워크플로 노드에서 더 고급 후처리를 하려면
--format jsonl을 사용하여 스트림을 파싱할 수 있습니다.
v2 가이드에서 업데이트하기
이전 Dalfox v2 문서는 dalfox pipe --rawdata를 사용했습니다. v3에서 이에 해당하는 것은 dalfox scan --input-type raw-http <파일>입니다. 일반 파일 경로만 받습니다. 원시 요청을 stdin으로 넘기면(dalfox pipe -i raw-http) 대상을 찾지 못하고, 프로세스 치환(<(...))은 "not a regular file"로 거부됩니다. 위 스크립트가 임시 파일을 쓰는 이유가 이것입니다.
표준 raw-http 사용법은 스캔 모드 페이지를 참조하세요.
참고
- 스캔 모드: Raw HTTP
- 출력과 리포트
- WAF 우회
- GitHub 논의 #992 (댓글): Caido If/Else 불리언 우회 스크립트와
--no-color제안이 담긴 원본 커뮤니티 보고