
phpMyAdmin 5.2.3 - عالي - عن بُعد - 2FA - config/set يمسح المصادقة الثنائية
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-config-set-2fa
المقال التفصيلي: https://abraxaslabs.tech/research/phpmyadmin-config-set-2fa
الفئة: صلاحية متبقية / خطوة تحقق مفقودة الوصول: عن بُعد
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
POST index.php?route=/config/set يكتب أي تفضيل مدرج في القائمة المسموح بها، بما في ذلك 2fa. لا يقوم UserPreferences::persistOption بأي تحقق. لا يزال Settings -> Two-factor يستدعي TwoFactor::check(true) قبل أن يسمح بإزالة العامل. أما /config/set فلا يفعل ذلك.
يمكن لجلسة مسجّلة الدخول، أو XSS/CSRF قادر على إرسال POST مع رمز الصفحة، إرسال key=2fa وvalue=null. تسجيل الدخول التالي بكلمة المرور لا يتضمن أي مطالبة TOTP أو WebAuthn أو Simple. إزالة دائمة، وليست تجاوزًا لطلب واحد.
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية / خطوة تحقق مفقودة |
| الوصول | عن بُعد (تسجيل دخول بكوكي موثّق؛ يتطلب رمز CSRF) |
| CWE | CWE-620 |
| CVSS | عالٍ: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| المنتج | phpMyAdmin |
| المتأثر | 5.2.3 وسم RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| المصادقة | تسجيل دخول بكوكي. يتطلب رمز CSRF. يكمل XSS أو CSRF للوصول إلى إزالة 2FA دائمة |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
إزالة 2FA من حساب phpMyAdmin دون تقديم TOTP أو WebAuthn أو حقل تأكيد Simple. يصبح تسجيل الدخول التالي بكلمة المرور فقط. تحكّم كامل في PMA بصفته ذلك المستخدم في MySQL (SQL، المستخدمون، التصدير).
| الصلاحية | الطريقة / المسار | الاستطلاع / السلامة / التوافر | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|
إبقاء 2fa بقيمة null وإسقاط العامل الثاني من pmadb | POST index.php?route=/config/set موثّق مع key=2fa وvalue=null بالإضافة إلى token صالح | سلامة مخزن التفضيلات | مُثبت مختبريًا. success:true، وأصبح config_data في pmadb يساوي [] |
| تسجيل الدخول بكلمة المرور فقط بعد ذلك الكتابة | جلسة كوكي جديدة، نفس مستخدم MySQL | سلامة مسار تسجيل الدخول | مُثبت مختبريًا. لا 2fa_confirm، ووصل إلى الواجهة العادية |
| الإبقاء على الجلسة الحالية بينما تختفي 2FA لتسجيلات الدخول اللاحقة | نفس المعالج؛ persistOption يكتب في المخزن، وليس في علم two_factor_check الحيّ | سلامة الجلسات اللاحقة | مُثبت مختبريًا. بقيت الجلسة A. كانت الجلسة B قد رأت 2FA. الجلسة C لم ترها |
| التسلسل من XSS مخزّن أو CSRF قادر على إرسال POST مع رمز الصفحة | بقايا مراجعة نفسها، وليس هذا المختبر | سلامة 2FA بعد POST من نفس الأصل | مُستنتج |
| إزالة 2FA عبر Settings | POST /preferences/two-factor مع 2fa_remove=1 | سلامة 2FA عبر الواجهة الموثّقة | مُثبت مختبريًا أنه مغلق. بدون العامل، يعرض PMA صفحة التأكيد ولا يزال pmadb يحتوي على backend=simple |
مغلق في هذه البقايا: الوصول غير الموثّق، تجاوز كلمة مرور MySQL، RCE على نظام التشغيل، قراءة صفوف pmadb الخاصة بمستخدمين آخرين. لم أحتج إلى البقايا #1 (توقيع CustomServer). لم أتجاوز كلمة مرور MySQL.
نفس التثبيت: بقايا WebAuthn CustomServer.
ثبّتُ الإصدار 5.2.3 بعد PMASA-2025-1/2/3. مصادقة الكوكيز، pmadb pma__userconfig. يُفعّل المختبر $cfg['DBG']['simple2fa'] فقط كي تتمكن صفحة Settings من تسجيل الواجهة الخلفية Simple دون مفتاح عتادي. يعيش كل من TOTP وWebAuthn في مفتاح التفضيل نفسه 2fa.
يأخذ SetConfigController الوسيط key والقيمة value بصيغة JSON ويستدعي Config::setUserValue. وُثّق UserPreferences::persistOption بعبارة "No validation is done!" وتُدرج apply() المفتاح 2fa في قائمة السماح كي لا يُسقَط بوصفه تفضيلًا غير معروف.
$result = $this->config->setUserValue(null, $key, json_decode($value));
json_decode('null') هو null في PHP. بعد ذلك تقوم persistOption('2fa', null, $default) بإلغاء تعيين config_data['2fa'] لأن القيمة الافتراضية لهذا المسار هي أيضًا null.
الإعدادات -> المصادقة الثنائية هي النقيض. لن يقوم TwoFactorController بتنفيذ configure('') حتى تُرجع TwoFactor::check(true) القيمة true.
المنعطفات الخاطئة المسجّلة مسبقًا: اعتبار 2fa_remove في الإعدادات هي الثغرة (فهي لا تزال تطلب عامل التحقق)؛ والادعاء بوجود وصول غير مُصادَق؛ والادعاء بتجاوز كلمة مرور MySQL؛ واعتبار هذا من بقايا #1 (CustomServer)؛ وصدفة عكسية. مسرح.
python3 phpmyadmin-config-set-2fa-Abraxas-Labs.py
# or: cd lab && ./run.sh
استهدف فقط http://127.0.0.1:19280. مشروع Compose phpmyadmin-config-set-2fa. ثبّت RELEASE_5_2_3. ينسخ run.sh أو يستنسخ ذلك الوسم إلى lab/src/ من أجل الصورة. يتم تفكيك الحزمة بعد التشغيل.
سجّلت الإعدادات Simple 2FA. أصاب متصفح ثانٍ صفحة 2fa_confirm. بقي طلب POST 2fa_remove بدون العامل على واجهة التأكيد وترك backend=simple في pmadb. ثم أعاد POST /config/set القيمة success:true، وأصبح pmadb []، ووصل تسجيل الدخول التالي إلى الواجهة العادية.
SUCCESS phpmyadmin-config-set-2fa enroll=simple ui-remove-blocked=yes config-set-cleared=yes next-login-password-only=yes PMA-CONFIG-SET-2FA-WITNESS
ارفض 2fa (وغيرها من مفاتيح المصادقة) على /config/set. اشترط TwoFactor::check(true) قبل أي تعديل على المصادقة الثنائية. أبقِ مسار Settings هو الكاتب الوحيد.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Controllers/Config/SetConfigController.phplibraries/classes/Config/UserPreferences.phpGNU Affero GPL v3.0. راجع LICENSE. للاستخدام في مختبر loopback فقط. دون أي ضمان.