
phpMyAdmin 5.2.3 - عالي - عن بُعد - 2FA - config/set يمسح المصادقة الثنائية
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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 وقيمة JSON value ويستدعي Config::setUserValue. UserPreferences::persistOption موثَّق بأنه "لا يتم إجراء أي تحقق!" يُدرج apply() المفتاح 2fa في القائمة المسموح بها حتى لا يُسقَط المفتاح كتفضيل غير معروف.
$result = $this->config->setUserValue(null, $key, json_decode($value));
json_decode('null') هو null في PHP. ثم يقوم persistOption('2fa', null, $default) بإلغاء تعيين config_data['2fa'] لأن القيمة الافتراضية لذلك المسار هي أيضاً null.
Settings -> Two-factor هو التباين. لا يقوم TwoFactorController بتنفيذ configure('') حتى يُرجع TwoFactor::check(true) القيمة true.
منعطفات خاطئة مسجَّلة بالفعل: اعتبار 2fa_remove في Settings هي الثغرة (لا يزال يطلب العامل)؛ ادعاء الوصول غير الموثَّق؛ ادعاء تخطي كلمة مرور 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/ من أجل الصورة. تُفكَّك الحزمة بعد التشغيل.
سجّلت Settings 2FA من نوع Simple. أصاب متصفح ثانٍ صفحة 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) قبل أي تعديل على 2FA. أبقِ مسار Settings هو الكاتب الوحيد.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Controllers/Config/SetConfigController.phplibraries/classes/Config/UserPreferences.phpGNU Affero GPL v3.0. انظر LICENSE. مختبر loopback فقط. لا ضمان.