
phpMyAdmin 5.2.3 - عالي - عن بُعد - CSRF - إزالة الرمز على /sql
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-csrf-sql
الفئة: CSRF الوصول: عن بُعد
phpMyAdmin 5.2.3 (الوسم RELEASE_5_2_3، الالتزام 962857e). يبني Common.php طلب PSR-7 من المتغيرات العامة قبل checkTokenRequestParam. عند عدم التطابق، يمسح Sanitize::removeRequestVars كلاً من $_POST و$_GET لكن ليس تلك اللقطة. ثم يُنسخ $sql_query من $request->getParsedBodyParam('sql_query'). طلبات AJAX POST تتوقف عند عدم تطابق الرمز. طلبات POST غير AJAX تستمر. يفضّل SqlController قيمة $_POST['sql_query'] المُجرَّدة وإلا يحتفظ بالقيمة العامة.
يكفي وجود ضحية تملك ملف تعريف جلسة phpMyAdmin. أرسل POST إلى index.php?route=/sql مع sql_query وبدون رمز صالح، وبدون ajax_request. يُنفَّذ استعلام SELECT بصلاحيات مستخدم MySQL ذلك. الإعداد الافتراضي CookieSameSite=Strict في 5.2.3 يحجب العديد من المتصفحات عبر المواقع. لكن same-site أو Lax أو None أو مصادقة HTTP لا تزال تصيبه. هذا ضابط CSRF معطوب في كل الأحوال.
| المعرّف | لا يوجد CVE بعد |
| الفئة | CSRF |
| الوصول | عن بُعد. الإعداد الافتراضي CookieSameSite=Strict يحجب العديد من المتصفحات عبر المواقع. تبقى same-site / Lax / None / مصادقة HTTP. |
| CWE | CWE-352 |
| CVSS | مرتفع: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| المنتج | phpMyAdmin |
| المتأثر | 5.2.3 الوسم RELEASE_5_2_3 (962857e) |
| المصادقة | ملف تعريف جلسة phpMyAdmin للضحية (أو مصادقة HTTP). بدون رمز CSRF صالح. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:19240 فقط |
أي شخص يستطيع جعل متصفح الضحية يرسل POST إلى phpMyAdmin بدون ajax_request يمكنه تنفيذ SQL بصلاحيات مستخدم MySQL ذلك.
| الصلاحية | الطريقة / المسار | مُثبت مختبرياً أو مُستنتج |
|---|---|---|
| تنفيذ SQL المهاجم بحساب MySQL الخاص بالضحية (سلامة + استطلاع لصندوق SQL ذلك) | POST index.php?route=/sql sql_query=... db=... بدون token، بدون ajax_request | مُثبت مختبرياً. احتوى جسم النتائج على PMA-CSRF-SQL-WITNESS. أظهر السجل العام استعلام SELECT باسم appuser |
| إيقاف نفس المعالج عند AJAX | نفس POST مع ajax_request=1 | مُثبت مختبرياً. Token mismatch. صف علامة INSERT غائب. لم يُنفّذ السجل العام ذلك INSERT |
تجاوز المعالجات التي تقرأ فقط $_POST المُجرَّدة | POST /database/structure/drop-table بدون رمز | مُثبت مختبرياً. keepme لا يزال موجوداً |
نفس الثغرة عند التصدير (SaveDir)، DROP/TRUNCATE للقسم، قفل الحساب، /config/set، إنشاء pmadb | أي معالج يقرأ جسم PSR-7 بعد التجريد | مُستنتج. لم يُختبر |
مغلق في هذا المختبر: PMA بدون مصادقة (يتطلب تسجيل دخول بالكوكيز أولاً)، مسارات AJAX (تخرج عند عدم التطابق)، drop-table بدون رمز، صدفة نظام التشغيل. الإعداد الافتراضي Strict SameSite يعني أن نموذجاً كلاسيكياً عبر المواقع غالباً لن يرسل الكوكي؛ لكن المتبقي لا يزال فحص CSRF فاشلاً على same-site وعلى عمليات النشر Lax/None.
ثمانية عمليات بحث متوازية في المصدر لـ RELEASE_5_2_3. ينشئ Common.php $request = createFromGlobals() قبل checkTokenRequestParam(). عند عدم التطابق، يمسح Sanitize::removeRequestVars() كلاً من $_POST/$_GET فقط. غير AJAX يستمر. يستخدم SqlController المتغير العام $sql_query إذا كان $_POST فارغاً. المسار GET|POST /sql.
مسارات خاطئة: اعتبار AJAX /sql هو المتبقي (يتوقف عند Token mismatch)؛ اعتبار drop-table هو المتبقي (هذا المعالج يقرأ فقط $_POST المُجرَّدة)؛ اعتبار الإعداد الافتراضي Strict SameSite يعني "CSRF مغلق" (الضابط لا يزال معطوباً؛ same-site / Lax / None تبقى).
python3 phpmyadmin-csrf-sql-Abraxas-Labs.py
أو
cd lab
./run.sh
Loopback فقط: http://127.0.0.1:19240. الصور phpmyadmin:5.2.3 وmysql:8.0. مشروع Compose phpmyadmin-csrf-sql. الـ PoC هو POST من same-site loopback (Strict SameSite لا يزال يرسل الكوكي). الشاهد PMA-CSRF-SQL-WITNESS.
SUCCESS phpmyadmin-csrf-sql sql-ran=yes ajax-abort=yes drop-held=yes PMA-CSRF-SQL-WITNESS
عند عدم التطابق، استبدل الطلب بجسم فارغ، أو ارفض جميع طلبات POST، وليس AJAX فقط. لا تنسخ sql_query من طلب قديم. افشل بشكل مغلق مثل تسجيل الخروج.
962857e)libraries/classes/Common.php لقطة الطلب قبل تجريد الرمزSanitize::removeRequestVars يمسح $_POST/$_GET فقطSqlController المتغير العام $sql_queryGNU Affero GPL v3.0. انظر LICENSE. مختبر Loopback فقط. بدون ضمان.