
Un fuzzer JSON conscient de la structure

jdam est un outil inspiré de Radamsa pour le fuzzing d'objets JSON arbitraires de manière consciente de la structure, ce qui garantit que les résultats du fuzzing seront toujours du JSON valide.
De nombreux outils de fuzzing existants modifient aveuglément l'entrée et rendent souvent le résultat invalide en JSON. Cela signifie que les tests de fuzzing ne sollicitent que l'analyseur JSON de l'application cible et n'atteignent jamais le code sous-jacent de l'application car les requêtes sont invalides. Jdam est une tentative de résoudre ce problème.
jdam est livré avec plusieurs modules de mutation qui visent tous à découvrir les problèmes potentiels et les vulnérabilités dans les systèmes qui traitent les données fuzzées. Certains modules effectuent des changements aléatoires tels que la suppression, le remplacement, l'échange et la répétition d'octets aléatoires, l'inversion de valeurs booléennes et la négation de nombres, tandis que d'autres modules remplacent les valeurs par des charges utiles qui tentent de déclencher des types de vulnérabilités spécifiques tels que :
Pour voir la liste complète des mutateurs disponibles, utilisez jdam -list.
jdam est encore assez brut et des erreurs sont à prévoir. Il est néanmoins suffisamment stable pour être publié pour les personnes aventureuses, mais considérez-le comme un logiciel alpha pour l'instant !
Téléchargez une release précompilée pour votre système d'exploitation ou clonez le dépôt et compilez avec 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 fonctionne en lui fournissant un objet JSON valide ({...}) via un pipe. Par défaut, jdam effectue une permutation aléatoire sur un champ aléatoire et affiche l'objet JSON résultant :
$ echo '{"hello":"world"}' | jdam
{"hello":{"id":1}}
Le JSON sujet peut être muté plusieurs fois avec le drapeau -rounds, mais gardez à l'esprit que les charges utiles de fuzzing précédentes peuvent également être mutées :
$ echo '{"hello":"world"}' | jdam -rounds 10
{"hello":{"_constructor":"${42*444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444442}"}}
Plusieurs objets fuzzés peuvent être générés avec le drapeau -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 peut écrire les résultats de fuzzing dans des fichiers individuels si vous souhaitez préparer des fichiers de test plutôt que d'utiliser la sortie standard de la commande :
$ echo '{"hello":"world"}' | jdam -count 10 -output "/tmp/jdam-%d.json"
La commande ci-dessus générera 10 fichiers dans /tmp de jdam-1.json à jdam-10.json. Le verbe spécial %d sera automatiquement remplacé par un numéro séquentiel afin que les résultats puissent être écrits dans des fichiers individuels.
Si vous voulez vous assurer que jdam ne mute jamais certains champs dans l'objet JSON sujet, vous pouvez lui demander de les ignorer avec le drapeau -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 est un fuzzer web fantastique et jdam peut facilement être utilisé comme entrée pour le fuzzing :
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
La commande ci-dessus demandera à ffuf d'obtenir son entrée de fuzzing depuis jdam et de l'envoyer comme corps de requête à PUT /api/todos/1. Les détails de la requête et de la réponse seront écrits dans tmp/ffuf_test/ si la réponse est 500 Erreur Interne du Serveur ou si le corps de la réponse contient certaines chaînes intéressantes.
Si vous connaissez Go et avez besoin d'un fuzzing très spécialisé, vous pouvez utiliser jdam dans votre propre code Go. Consultez le dossier examples/ pour des exemples d'utilisation.
Le fuzzing n'est utile que si vous pouvez détecter qu'une mutation particulière a causé un problème ou déclenché une vulnérabilité. Ces signes varieront en fonction du système cible et de l'environnement, mais voici quelques bonnes généralités à surveiller :
sleep.error, failure, failed, etc./etc/passwd afin d'avoir un contenu prévisible. Donc toute réponse contenant root: est très intéressante !42*42 par les moteurs de template vulnérables, ce qui équivaut à 1.764. Si ce nombre apparaît jamais dans une réponse, il y a de fortes chances que le système soit vulnérable à l'injection de template.jdam est encore un outil très récent donc il n'a pas encore découvert de bons bugs. J'aimerais beaucoup avoir de vos nouvelles si jdam vous a aidé à obtenir un CVE ou une belle prime de bug et je lierai volontiers votre article ou rapport ici. :)
Je tiens à remercier et à attribuer le mérite à quelques autres projets :
Bon Fuzzing !
0x suivi d'une longue chaîne hexadécimale ou d'une longue chaîne numérique, cela pourrait être une indication qu'une charge utile a déclenché une vulnérabilité de chaîne de format./tmp du système avec le nom jdam.<number>.fail. Le nombre sera un nombre aléatoire de cinq chiffres pour faciliter l'identification de la charge utile responsable.