
구조 인식 JSON 퍼저

jdam은 임의의 JSON 객체를 구조 인식 방식으로 퍼징하는 Radamsa에서 영감을 받은 도구로, 퍼징 결과가 항상 유효한 JSON임을 보장합니다.
많은 기존 퍼징 도구는 입력을 맹목적으로 변경하여 결과가 유효하지 않은 JSON이 되는 경우가 많습니다. 이는 퍼즈 테스트가 대상 애플리케이션의 JSON 파서만 실행하고, 요청이 유효하지 않기 때문에 퍼즈 테스트가 기본 애플리케이션 코드에 도달하지 못한다는 것을 의미합니다. Jdam은 이 문제를 해결하기 위한 시도입니다.
jdam에는 퍼징된 데이터를 처리하는 시스템의 잠재적인 문제와 취약점을 발견하는 것을 목표로 하는 여러 변이 모듈이 함께 제공됩니다. 일부 모듈은 무작위 바이트 삭제, 교체, 스왑, 반복, 부울 값 반전, 숫자 부정과 같은 무작위 변경을 수행하는 반면, 다른 모듈은 값을 특정 취약점 유형을 트리거하려는 페이로드로 대체합니다. 예를 들면:
사용 가능한 뮤테이터의 전체 목록을 보려면 jdam -list를 사용하세요.
jdam은 아직 거친 상태이며 오류가 예상됩니다. 하지만 모험심 있는 분들을 위해 출시할 수 있을 만큼 안정적이지만, 현재는 알파 소프트웨어로 취급하세요!
운영 체제에 맞는 미리 빌드된 릴리스를 다운로드하거나 리포지토리를 클론하고 로 컴파일하세요.
go build -o jdam cmd/jdam/*Usage of jdam:
-count int
Number of fuzzed objects to generate (default 1)
-ignore string
Comma-separated list of fields to exclude from fuzzing
-list
List available mutators
-max-depth int
Maximum object depth to fuzz (default 100)
-mutators string
Comma-separated list of mutator IDs to use (default: all)
-nil-chance float
Probability of value being set to nil (between 0 (no nils) and 1 (all nils)) (default 0.75)
-output string
Output file pattern to use for results (e.g. /tmp/jdam-%d.json)
-rounds int
Number of times to fuzz object (default 1)
-seed int
Seed to use for pseudo-random number generator (default: current UNIX timestamp)
-verbose
Print activity information
-version
Print current jdam version
jdam은 유효한 JSON 객체({...})를 파이프로 전달하여 작동합니다. 기본적으로 jdam은 무작위 필드에 대해 하나의 무작위 순열을 수행하고 결과 JSON 객체를 출력합니다:
$ echo '{"hello":"world"}' | jdam
{"hello":{"id":1}}
주제 JSON은 -rounds 플래그로 여러 번 변이할 수 있지만, 이전 퍼징 페이로드도 변이될 수 있다는 점을 명심하세요:
$ echo '{"hello":"world"}' | jdam -rounds 10
{"hello":{"_constructor":"${42*444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444442}"}}
여러 개의 퍼징된 객체를 -count 플래그로 생성할 수 있습니다:
$ echo '{"hello":"world"}' | jdam -count 10
{"hello":"sorld"}
{"hello":"../../../../../../../../../../../../../../../../../../../../etc/passwd"}
{"hello":"{{42*42}}"}
{"hello":null}
{"hello":"' \u0026\u0026 this.password.match(/.*/)//+\u0000"}
{"hello":{"$where":"1"}}
{"hello":"null"}
{"hello":"\";touch /tmp/jdam.70797.fail'"}
{"hello":null}
{"hello":"|| 1==1"}
jdam은 명령의 STDOUT 대신 테스트 파일을 준비하려는 경우 퍼징 결과를 개별 파일에 쓸 수 있습니다:
$ echo '{"hello":"world"}' | jdam -count 10 -output "/tmp/jdam-%d.json"
위 명령은 /tmp에 jdam-1.json부터 jdam-10.json까지 10개의 파일을 생성합니다. 특수 동사 %d는 자동으로 순차 번호로 대체되어 결과를 개별 파일에 쓸 수 있습니다.
jdam이 주제 JSON 객체의 특정 필드를 변이하지 않도록 하려면 -ignore 플래그로 jdam에 무시하도록 지시할 수 있습니다:
$ echo '{"id":13,"articleId":37,"comment":"Hello"}' | ./jdam -count 10 -ignore id,articleId
{"id":13,"articleId":37,"comment":"%x%x%x%x"}
{"id":13,"articleId":37,"comment":"search=')] | //user/*[contains(*,'"}
{"id":13,"articleId":37,"comment":"' and count(/comment())=1 and '1'='1"}
{"id":13,"articleId":37,"comment":"\u0016ello"}
{"id":13,"articleId":37,"comment":"/"}
{"id":13,"articleId":37,"comment":null}
{"id":13,"articleId":37,"comment":"{{{42*42}}}"}
{"id":13,"articleId":37,"comment":"@*"}
{"id":13,"articleId":37,"comment":"Helloooooooooooooooo"}
{"id":13,"articleId":37,"comment":"//*"}
ffuf는 훌륭한 웹 퍼저이며 jdam을 퍼징 입력으로 쉽게 사용할 수 있습니다:
ffuf -input-cmd 'cat subject.json | jdam -rounds 3' -d FUZZ -u http://localhost/api/todos/1 -X PUT -v -mc 500 -mr 'error|failed|failure|fault|abort|root:|1764|0x|\d{20}' -od /tmp/ffuf_test
위 명령은 ffuf가 jdam에서 퍼징 입력을 가져와 요청 본문으로 PUT /api/todos/1에 보내도록 지시합니다. 응답이 500 Internal Server Error이거나 응답 본문에 특정 흥미로운 문자열이 포함된 경우 요청 및 응답 세부 정보가 tmp/ffuf_test/에 기록됩니다.
Go를 알고 매우 전문화된 퍼징이 필요하다면 자신의 Go 코드 내에서 jdam을 사용할 수 있습니다. 사용 예제는 examples/ 폴더를 참조하세요.
퍼징은 특정 변이가 문제를 일으키거나 취약점을 트리거했는지 감지할 수 있을 때만 유용합니다. 이러한 징후는 대상 시스템과 환경에 따라 다르지만, 주의해야 할 몇 가지 일반적인 사항은 다음과 같습니다:
sleep을 지시했을 가능성이 높습니다.error, failure, failed 등과 같은 오류 관련 키워드가 포함된 응답./etc/passwd 파일을 포함하려고 시도합니다. 따라서 root:가 포함된 응답은 매우 흥미롭습니다!42*42를 평가하도록 시도하며, 이 값은 1.764입니다. 이 숫자가 응답에 나타나면 시스템이 템플릿 인젝션에 취약할 가능성이 높습니다.0x 뒤에 긴 16진수 문자열이나 긴 숫자 문자열이 포함되어 있으면 페이로드가 포맷 문자열 취약점을 트리거했음을 나타낼 수 있습니다./tmp 폴더에 jdam.<number>.fail이라는 이름의 파일을 생성하려고 시도합니다. 숫자는 무작위 다섯 자리 숫자로, 책임이 있는 페이로드를 더 쉽게 식별할 수 있도록 합니다.jdam은 아직 매우 새로운 도구이므로 아직 좋은 버그를 발견하지 못했습니다. jdam이 CVE나 좋은 버그 바운티를 획득하는 데 도움이 되었다면 알려주시기 바랍니다. 기꺼이 여러분의 글 또는 보고서를 여기에 링크하겠습니다. :)
감사의 말을 전하고 싶은 다른 프로젝트들이 있습니다:
즐거운 퍼징 되세요!