

jdamは、Radamsaに触発されたツールで、任意のJSONオブジェクトを構造を考慮した方法でファジングし、ファジング結果が常に有効な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はランダムなフィールドに対して1つのランダムな置換を実行し、結果の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 フラグを使用して無視するように指示できます。
$ 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は素晴らしいWebファザーであり、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 という名前のファイルを作成しようとします。番号はランダムな5桁の数字で、責任のあるペイロードを特定しやすくなります。jdamはまだ非常に新しいツールであり、まだ良いバグは発見されていません。jdamがCVEの獲得や素晴らしいバグ報奨金獲得に役立った場合は、ぜひお知らせください。喜んでここにあなたのレポートや記事へのリンクを掲載します。:)
以下のプロジェクトに感謝の意を表します。
Happy Fuzzing!