
أداة اختبار عشوائي للتعبيرات المنطقية (regex) تعمل كصندوق أسود، تولّد حمولات لتجاوز التحقق من صحة الإدخال، واكتشاف عمليات التطبيع، والتهرب من جدران الحماية (WAF) في تطبيقات الويب.
REcollapse هي أداة مساعدة لاختبار التعبيرات المنتظمة بطريقة الصندوق الأسود (black-box regex fuzzing) لتجاوز عمليات التحقق واكتشاف التطبيع (normalizations) في تطبيقات الويب.
يمكن أن تكون مفيدة أيضًا لتجاوز أنظمة حماية جدران الحماية للتطبيقات الويب (WAFs) والتخفيفات الضعيفة للثغرات. لمزيد من المعلومات، ألق نظرة على مقالة REcollapse.
الهدف من هذه الأداة هو إنشاء حمولات (payloads) للاختبار. يجب إجراء عملية الفحص الفعلية (fuzzing) باستخدام أدوات أخرى مثل Burp (المتسلل)، Caido (الأتمتة)، ffuf، أو ما شابه ذلك.
المتطلبات: بايثون 3
pip3 install recollapse أو python3 setup.py install أو pip3 install .
دوكر
docker build -t recollapse . أو docker pull 0xacb/recollapse
$ recollapse -h
usage: recollapse [-h] [-m MODES] [-e {1,2,3,4}] [-r RANGE] [-s SIZE] [-f FILE] [-an] [-mn MAXNORM] [-mt MAXTRUNC] [-nt] [-tt] [-ct]
[--html] [--version]
[input]
REcollapse is a helper tool for black-box regex fuzzing to bypass validations and discover normalizations in web applications
positional arguments:
input original input
options:
-h, --help show this help message and exit
-m, --modes, -p, --positions MODES
variation modes. Example: 1,2,3,4,5,6,7 (default). 1: starting, 2: separator, 3: normalization, 4:
termination, 5: regex metacharacters, 6: case folding/upper/lower, 7: byte truncation
-e, --encoding {1,2,3,4}
1: URL-encoded format (default), 2: Unicode format, 3: Raw format, 4: Double URL-encoded format
-r, --range RANGE range of bytes for fuzzing. Example: 0,0xff (default)
-s, --size SIZE number of fuzzing bytes (default: 1)
-f, --file FILE read input from file
-an, --alphanum include alphanumeric bytes in fuzzing range
-mn, --maxnorm MAXNORM
maximum number of normalizations (default: 3)
-mt, --maxtrunc MAXTRUNC
maximum number of truncations (default: 3)
-nt, --normtable print normalization table
-tt, --trunctable print truncation table
-ct, --casetable print case table
--html output tables in HTML format
--version show recollapse version
لنعتبر this_is.an_example كالمدخل.
الأنماط (Modes)
$this_is.an_examplethis$_$is$.$an$_$examplethis_is.an_example$.^$*+-?()[]{}\|الترميز (Encoding)
application/x-www-form-urlencoded أو معاملات الاستعلام/النص: %22this_is.an_exampleapplication/json: \u0022this_is.an_examplemultipart/form-data: "this_is.an_exampleالنطاق (Range)
تحديد نطاق من البايتات للفحص: -r 1-127. سيؤدي هذا إلى استبعاد الأحرف الأبجدية الرقمية ما لم يتم توفير الخيار -an.
الحجم (Size)
تحديد حجم الفحص للأنماط 1 و 2 و 4. الطريقة الافتراضية هي فحص جميع القيم الممكنة لبايت واحد. زيادة الحجم ستستهلك المزيد من الموارد وتولد مدخلات أكثر بكثير، ولكنها قد تؤدي إلى اكتشاف تجاوزات جديدة.
الملف (File)
يمكن توفير المدخل كوسيط موضعي، أو من الإدخال القياسي (stdin)، أو من ملف عبر الخيار -f.
الأبجدي الرقمي (Alphanumeric)
افتراضيًا، سيتم استبعاد الأحرف الأبجدية الرقمية من توليد المخرجات، والتي عادة ما تكون غير مثيرة للاهتمام من حيث الاستجابات. يمكنك السماح بذلك باستخدام الخيار -an.
الحد الأقصى لعدد التطبيعات (Maximum number of normalizations)
ليست جميع مكتبات التطبيع تتصرف بنفس الطريقة. افتراضيًا، يتم إنشاء ثلاثة احتمالات للتطبيعات لكل فهرس مدخل، وهذا عادة ما يكون كافياً. استخدم الخيار -mn للمضي قدمًا.
الجداول (Tables)
استخدم الخيار -nt لعرض جدول التطبيع، والخيار -ct لعرض جدول الحالة، والخيار -tt لعرض جدول الاقتطاع. يمكنك أيضًا استخدام الخيار --html لإخراج الجداول بتنسيق HTML.
$ recollapse -nt --html > normalization_table.html
$ recollapse -tt --html > truncation_table.html
$ recollapse -ct --html > case_table.html
استخدام REcollapse كأداة سطر أوامر:
$ recollapse -e 1 -m 1,2,4 -r 10-11 https://legit.example.com
%0ahttps://legit.example.com
%0bhttps://legit.example.com
https%0a://legit.example.com
https%0b://legit.example.com
...
$ echo "[email protected]" | recollapse
%[email protected]
%[email protected]
...
$ echo "<svg/onload=alert(1)>" | recollapse | ffuf -w - -u "https://example.com/?param=FUZZ" -mc 200,403,500
استخدام REcollapse كمكتبة:
from recollapse import Recollapse
recollapse = Recollapse(modes=Recollapse.DEFAULT_MODES,
encoding=Recollapse.ENCODING_RAW)
variants = recollapse.generate("<script")
for variant in variants:
print(variant)
تم تقديم هذه التقنية في الأصل في BSidesLisbon 2022
مقالة المدونة: https://0xacb.com/2022/11/21/recollapse/
الشرائح:
مقاطع الفيديو:
الجداول:
شكر خاص
و
هذا المشروع مصنوع لأغراض تعليمية واختبار أخلاقي فقط. استخدام هذه الأداة لمهاجمة أهداف دون موافقة مسبقة متبادلة غير قانوني. لا يتحمل المطورون أي مسؤولية ولا يتحملون المسؤولية عن أي سوء استخدام أو ضرر ناتج عن هذه الأداة.