
GromHacks Labs -- قوائم الحمولة التي لا يريدونك أن تمتلكها. 1,324 مسبار حقن تم إرسالها من السفينة الأم لاكتشاف ما يمكن حقنه عبر 20 فئة من الثغرات. نحن لا نستغل، بل نطرق الباب ونرى من يرد. تم اختبار كل حمولة ضد محللات حقيقية لأن الكائنات الفضائية تطلب دليلاً. لا تثق بأي مدخل. شكك في كل شيء!
هل وجدت حمولة (payload) لا تعمل؟ يرجى فتح issue مع الحمولة، وسياق الهدف، وما كنت تتوقع حدوثه. طلبات السحب (Pull requests) التي تتضمن إصلاحات أو حمولات جديدة مرحّب بها دائمًا.
البحث مستمر. هذا المشروع قيد التطوير النشط وسيتم تحديثه بسياقات حقن جديدة، وحمولات، وتحسينات في التحقق.
إخلاء المسؤولية: تُقدَّم هذه الحمولات لأغراض اختبار الأمان المصرّح به، والتعليم، والبحث فقط. لا يتحمل المؤلفون أي مسؤولية أو التزام عن أي إساءة استخدام أو تأثيرات لاحقة. استخدمها على مسؤوليتك الكاملة. باستخدامك هذا المشروع فإنك تقبل المسؤولية الكاملة عن أفعالك.
الترخيص: MIT - راجع LICENSE
1,618 سلسلة حمولة فريدة عبر 37 فئة لاختبار الأمان بالإضافة إلى مجموعة polyglot شاملة، و35 صيغة إلغاء تسلسل (deserialization) ومكتبة ونقطة استقبال (sink) مُسمّاة، و20 محرك قوالب. يحتوي الملف الرئيسي الحافظ للسياق على 1,760 إسنادًا من الحمولة إلى القسم عبر 661 قسمًا، بحيث تبقى السلسلة المشتركة مرتبطة بكل محلل (parser) وسياق إدراج تنطبق عليه. تتضمن القائمة المصغّرة المكوّنة من 108 حمولات مجسّات تمثيلية لـ GraphQL، وHQL/JPQL، وXPath، وJSONPath، وبناء JSON، وتلويث معاملات HTTP، وXQuery، وFirestore، وSMTP/IMAP وترويسات البريد الإلكتروني، وترويسات Host، وبنية XML/SOAP، وLDAP DN، وHTML/CSS، وCSV، والسجلات (logs)، وLaTeX. تتفاوت تغطية التحقق حسب الحمولة والمحلل وسياق الإدراج.
تغطي مصفوفة اللغات C، وC++، وC#، وDart، وElixir، وErlang، وGo، وJava، وJavaScript، وKotlin، وLua، وObjective-C، وPerl، وPHP، وPython، وRuby، وRust، وScala، وSwift، وTypeScript.
المدقّق العام (general validator) هو فحص أولي (smoke check)، وليس دليلًا على الاستغلال: فقد اعتبرت النتائج السابقة الأخطاء العشوائية ومهلات الطلبات (request timeouts) بمثابة إصابات. يغطي اختبار الانحدار السياقي تسع لهجات SQL حيّة، بما في ذلك مواضع السلاسل النصية، والقيم الرقمية، وجملة ORDER BY المحقونة، وتعبيرات الفرز المباشرة؛ وGraphQL.js، وHibernate HQL/JPQL، وXPath/XQuery/JSONPath المباشرة، وبناء JSON وتلويث المعاملات المكررة، ومرشحات Firestore المهيكلة، وحقن أوامر SMTP/IMAP وترويسات البريد الإلكتروني، وتسميم URL عبر ترويسة Host، وبنية XML وSOAP، وحقن مرشح LDAP وDN، وHTML/CSS/XSS في Chromium، واختراق خلية صيغة CSV، وتزوير السجلات (log forging)، وحقن مصدر LaTeX، واقتباس/backtick/خط أنابيب POSIX shell، وسياقات $() والأسطر الجديدة المفكوكة بالنسبة المئوية، وبيئات SSRF/path/XXE المحلية، وMongoDB/CouchDB/Redis/ArangoDB/DynamoDB PartiQL/Cassandra CQL/Couchbase SQL++/Elasticsearch/Neo4j، وEL، وXSLT، وSSI، وتلويث النموذج الأولي (prototype pollution)، وعمليات استدعاء إلغاء التسلسل التمثيلية. تتضمن فحوصات المتصفح سياقات محلل السمات غير المقتبسة، وجزء السمات، وتعليق HTML، و</script>. تتحقق مصفوفة اللغات من الرياضيات، والأخطاء، والتوقيت، وOOB، واختراقات الاقتباس في المصدر المُولَّد في جميع اللغات العشرين المطلوبة؛ ويتم اختبار سياقات الاقتباس البديلة الشائعة وbacktick حيثما كان مدعومًا، إلى جانب polyglot حسابي مشترك في جميع اللغات العشرين وسلاسل تنسيق وقت التشغيل حيثما ينطبق. راجع COVERAGE.md للمصفوفة المُتحقَّق منها والفجوات المتبقية الخاصة بكل محرك.
معظم قوائم الحمولات المتاحة علنًا منظّمة حسب نوع الثغرة: قائمة لحقن SQL، وأخرى لـ XSS، وأخرى لحقن الأوامر، وهكذا. يختار المختبر القائمة التي يعتقد أنها تطابق الهدف، ويحمّلها في أداة intruder، ويشغّلها ضد معامل (parameter). إذا أخطأ في تخمين فئة الثغرة، فإن الفحص بأكمله لا ينتج شيئًا. وإذا كانت الواجهة الخلفية قاعدة بيانات غير شائعة، أو محرك قوالب غير قياسي، أو لغة لم تأخذها القائمة في الحسبان، فإن الحمولات تفشل بصمت. فيمضي المختبر معتقدًا أن المعامل نظيف.
لهذا النهج مشكلتان جوهريتان. أولًا، يتطلب من المختبر معرفة الثغرة الموجودة قبل أن يجدها. ثانيًا، معظم الحمولات المتداولة نظرية -- منسوخة بين المشاريع ومقالات المدونات دون أن تُختبر أبدًا ضد محلل حقيقي. تبدو صحيحة. وقد تكون صحيحة نحويًا. لكنها لا تُفعّل فعليًا استجابة قابلة للكشف من الهدف.
يستخدم هذا المشروع polyglots حيث يمكن لسلسلة واحدة تغطية سياقات متعددة ذات صلة. لا يزال سلوك الحمولة يعتمد على كيفية إدراج التطبيق لها: قد تكون وسيطة shell غير مقتبسة، أو مقتبسة بعلامة اقتباس مفردة، أو مزدوجة؛ وتختلف تعبيرات SQL النصية والرقمية؛ وتستخدم محركات القوالب محددات (delimiters) غير متوافقة. يحتاج بيئة الاختبار (testbed) إلى نمذجة هذه الأغلفة صراحةً. لا ينبغي افتراض أن أي سلسلة واحدة ستخترق كل اقتباس أو تعليق أو محلل.
تُجمَّع الحمولات حول ركائز الكشف (detection pillars) -- استجابات قابلة للملاحظة يمكن أن تقدّم دليلًا في سياق مطابق:
7*191 يُقيَّم إلى 1337. إذا ظهر هذا الرقم في الاستجابة وكانت الحمولة قد أرسلت 7*191 فقط (وليس القيمة الحرفية 1337)، فقد قيّم محلل الهدف التعبير. تثبت النتيجة التقييم في تلك النقطة (sink)، والتي قد تكون استعلامًا أو قالبًا أو لغة تعبير أو بيئة تشغيل كود.هذه الإشارات مفيدة فقط عند فحصها في السياق الفعلي للحمولة. المدقّق العام هو اختبار أولي؛ فخطأ المحلل، أو المهلة، أو السلسلة المنعكسة وحدها لا تثبت أن حمولة نُفِّذت. استخدم فحوصات Docker الخاصة بالسياق للحصول على دليل أقوى.
تعتمد حمولات OOB والتوقيت التقليدية على أوامر shell: curl، وnslookup، وping، وsleep. هذه تتعطل باستمرار. فهي تعتمد على نظام تشغيل الهدف، وPATH المتاح، وأي shell يفسّر الأمر، وما إذا كانت العملية تملك إذنًا لإنشاء عمليات فرعية. حمولة OOB قائمة على curl تعمل على Ubuntu تفشل على Alpine (لا يوجد curl)، وتفشل على Windows (لا يوجد curl)، وتفشل داخل حاوية مقيّدة (لا تنفيذ عمليات صادرة).
يستبدل هذا المشروع أوامر shell بالبدائل المدمجة الأصلية للغة (language-native built-ins) حيثما أمكن. تستخدم حمولات Python الدالتين urllib.request.urlopen() وtime.sleep(). وتستخدم حمولات Java الدالتين java.net.URL.openStream() وThread.sleep(). ويستخدم Ruby الدالتين Net::HTTP.get() وKernel.sleep(). ويستخدم PHP الدالتين file_get_contents() وsleep(). تأتي هذه الدوال من بيئة تشغيل اللغة أو المكتبة القياسية، لذا تتجنب البحث في PATH واعتماديات العمليات الفرعية. ومع ذلك، قد تظل سياسة وقت التشغيل والإعدادات قادرة على تعطيل الوصول إلى الشبكة أو واجهات برمجة تطبيقات فردية؛ وتسجّل مصفوفة البيئة (fixture matrix) البيئة الدقيقة التي جرى اختبارها.
حيث قد تكون استيرادات المكتبة القياسية محظورة، تستخدم بعض الحمولات بدائل خالية من الاستيراد مثل Atomics.wait() في Node واتصالات socket الخام لـ OOB. تُستبعد الحلقات كثيفة الموارد من فحوصات المجموعة الافتراضية.
ليس كل شيء يمكن أن يكون polyglot. تستخدم محركات القوالب صيغة غير متوافقة جوهريًا -- فـ {{}} في Jinja2 لا تعني شيئًا لـ <%= %> في ERB، ولا أي منهما يُحلَّل كـ ${} في Freemarker). صيغ إلغاء التسلسل هي بيانات ثنائية أو مهيكلة خاصة بإطار عمل واحد. لهذه الفئات، يستخدم المشروع حمولات لكل محرك منظّمة تحت نظام ركائز الكشف نفسه، وتغطي 20 محرك قوالب و35 صيغة إلغاء تسلسل ومكتبة ونقطة استقبال مُسمّاة عبر 11 مجموعة وقت تشغيل.
تجمع المجموعة (corpus) بين polyglots للسياقات المتوافقة ومجسّات لكل محرك حيث تختلف الصيغة. تغطية الاختبار ونتائجه محصورة في البيئات والأغلفة التي جرى اختبارها.