
مُختبر عشوائي لـ JSON مدرك للبنية

jdam هي أداة مستوحاة من Radamsa لتشويش كائنات JSON العشوائية بطريقة واعية بالهيكل، مما يضمن أن نتائج التشويش ستكون دائمًا JSON صالحة.
العديد من أدوات التشويش الحالية ستغير المدخلات بشكل أعمى وغالبًا ما تتسبب في أن تكون النتيجة JSON غير صالحة. هذا يعني أن اختبار التشويش سيمارس فقط محلل JSON للتطبيق المستهدف ولن يصل اختبار التشويش أبدًا إلى كود التطبيق الأساسي لأن الطلبات غير صالحة. jdam هي محاولة لحل هذه المشكلة.
تأتي jdam مع عدة وحدات تحوير تهدف جميعها إلى اكتشاف المشكلات والثغرات المحتملة في الأنظمة التي تعالج البيانات المشوشة. تقوم بعض الوحدات بإجراء تغييرات عشوائية مثل إسقاط واستبدال وتبديل وتكرار وحدات البايت العشوائية، وعكس القيم المنطقية، ونفي الأرقام، بينما تستبدل وحدات أخرى القيم بحمولات تحاول استدعاء أنواع ثغرات محددة مثل:
لعرض قائمة كاملة بالمحولات المتاحة، استخدم .
jdam -listjdam لا تزال خشنة إلى حد ما ويجب توقع الأخطاء. ومع ذلك، فهي مستقرة بما يكفي ليتم إصدارها للمغامرين هناك، لكن تعامل معها كبرنامج ألفا في الوقت الحالي!
قم بتنزيل [إصدار] مبني مسبقًا لنظام التشغيل الخاص بك أو استنسخ المستودع وارمّب باستخدام 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"
سيقوم الأمر أعلاه بإنشاء 10 ملفات في /tmp من jdam-1.json إلى jdam-10.json. سيتم استبدال الكلمة الخاصة %d تلقائيًا برقم تسلسلي بحيث يمكن كتابة النتائج إلى ملفات فردية.
إذا كنت تريد التأكد من أن jdam لا يقوم أبدًا بتحوير حقول محددة في كائن JSON الموضوع، يمكنك إخبار jdam بتجاهلها باستخدام العلم -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 هو مشوش ويب رائع ويمكن استخدام 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. سيتم كتابة تفاصيل الطلب والاستجابة إلى tmp/ffuf_test/ إذا كانت الاستجابة 500 Internal Server Error أو إذا كان جسم الاستجابة يحتوي على سلاسل مثيرة للاهتمام معينة.
إذا كنت تعرف Go وتحتاج إلى تشويش متخصص للغاية، يمكنك استخدام jdam داخل كود Go الخاص بك. راجع مجلد examples/ للحصول على أمثلة الاستخدام.
يكون التشويش مفيدًا فقط إذا كان بإمكانك اكتشاف أن تحويرًا معينًا تسبب في مشكلة أو استدعى ثغرة. ستختلف هذه العلامات اعتمادًا على النظام المستهدف والبيئة، ولكن إليك بعض الأشياء الجيدة العامة التي يجب الانتباه إليها:
sleep.error وfailure وfailed إلخ./etc/passwd للحصول على محتوى يمكن التنبؤ به. لذا أي استجابة تحتوي على root: مثيرة جدًا للاهتمام!42*42 الذي يساوي 1.764. إذا حدث هذا الرقم في استجابة، فهناك احتمال كبير أن النظام عرضة لحقن القوالب.0x متبوعة بسلسلة ست عشرية طويلة أو سلسلة رقمية طويلة، فقد يكون ذلك مؤشرًا على أن حمولة استدعت ثغرة سلسلة التنسيق./tmp للنظام باسم jdam.<number>.fail. سيكون الرقم عشوائيًا من خمسة أرقام لتسهيل التعرف على الحمولة المسؤولة.jdam لا تزال أداة جديدة جدًا لذا لم تكتشف أي أخطاء جيدة بعد. أحب أن أسمع منك إذا ساعدتك jdam في الحصول على CVE أو مكافأة أخطاء جيدة وسأربط بسعادة بكتابتك أو تقريرك هنا. :)
أود أن أعطي الإسناد والشكر لعدد من المشاريع الأخرى:
تشويش سعيد!