
phpMyAdmin 5.2.3 - عالي - عن بُعد - CSRF - إزالة الرمز على /sql
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-csrf-sql
التحليل المكتوب: https://abraxaslabs.tech/research/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 على أنه المتبقي (فهو يُجهض بسبب عدم تطابق الرمز)؛ التعامل مع drop-table على أنه المتبقي (ذلك المعالج يقرأ فقط $_POST المُجرَّد)؛ التعامل مع Strict SameSite الافتراضي على أنه "CSRF مغلق" (فالتحكم لا يزال معطوبًا؛ وتبقى same-site / Lax / None).
python3 phpmyadmin-csrf-sql-Abraxas-Labs.py
أو
cd lab
./run.sh
للاسترجاع المحلي فقط: http://127.0.0.1:19240. الصور phpmyadmin:5.2.3 و mysql:8.0. مشروع Compose phpmyadmin-csrf-sql. الـ PoC عبارة عن POST للاسترجاع المحلي من نفس الموقع (لا يزال 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 فقط. دون أي ضمان.