
phpMyAdmin 5.2.3 - عالي - عن بُعد - تخطي المصادقة الثنائية - يمكن تخطي عملية WebAuthn
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-webauthn
المقال التقني: https://abraxaslabs.tech/research/phpmyadmin-webauthn
الفئة: تجاوز المصادقة الثنائية (2FA) النطاق: عن بُعد
phpMyAdmin 5.2.3 (الوسم RELEASE_5_2_3). حزمة tarball الافتراضية. web-auth/webauthn-lib هي suggest / require-dev. لا يقوم composer install --no-dev بتثبيتها. لذلك يستخدم createServer الصنف CustomServer. يقرأ هذا الصنف response.signature (يجب أن يكون الحقل موجودًا وقابلًا لفك الترميز) ولا يتحقق منه عبر COSE أبدًا. ولا يستخدم أبدًا credentialPublicKey المخزَّن. يقبل اختبار CustomServerTest الخاص بالمنتج نفسه تأكيدًا بدون مفتاح عام.
الفحوصات البنيوية حقيقية: معرّف الاعتماد في allowCredentials، وclientData.type == webauthn.get، وتطابق التحدي مع الجلسة، ومضيف الأصل، وrpIdHash، وحضور المستخدم. يتم تحليل التوقيع وتجاهله. بعد كلمة مرور MySQL، يكون توقيع WebAuthn عشوائيًا لا يزال يطابق تلك الحقول جلسة phpMyAdmin كاملة. تلك هي قاعدة البيانات. إذا كنت قد ثبّتت web-auth/webauthn-lib فعليًا، فأنت على WebauthnLibServer ولست مصابًا بهذه الثغرة.
| المعرّف | لا يوجد CVE بعد |
| الفئة | تجاوز المصادقة الثنائية / غياب التحقق من التوقيع |
| النطاق | عن بُعد (تسجيل دخول بالكوكي، ثم تخطي WebAuthn) |
| CWE | CWE-347، CWE-287 |
| 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. حزمة tarball الافتراضية / composer install --no-dev |
| المصادقة | تسجيل دخول بالكوكي (كلمة مرور MySQL)، ثم تخطي WebAuthn |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:18080 فقط |
لا يزال بحاجة إلى كلمة مرور MySQL (تسجيل الدخول بالكوكي). بعد تلك الكلمة، يرسل webauthn_request_response عبر POST مع تحدي مطابق، ومضيف أصل، وrpIdHash، وحضور المستخدم، ومعرّف اعتماد مسجَّل، وتوقيع عشوائي. فيصل إلى الواجهة العادية. المصادقة الثنائية اختفت. تلك هي قاعدة البيانات (SQL، المستخدمون، التصدير)، وليست صدفة PHP على المضيف.
إذا كنت قد ثبّتت web-auth/webauthn-lib فعليًا، فأنت على WebauthnLibServer ولست مصابًا بهذه الثغرة.
| الصلاحية | الطريقة / المسار | مُثبَت في المختبر أم مُستنتَج |
|---|---|---|
| إكمال المصادقة الثنائية عبر WebAuthn دون المصادِق (سلامة العامل الثاني) | POST webauthn_request_response بعد كلمة المرور، توقيع عشوائي | مُثبَت في المختبر. still_2fa=False landed=True |
| PMA كامل بصلاحيات مستخدم MySQL ذلك (سلامة + استطلاع لصندوق SQL) | الجلسة نفسها | مُثبَت في المختبر. علامات واجهة الصفحة الرئيسية موجودة |
| تخطي كلمة مرور MySQL | POST غير مُصادَق | مُثبَت في المختبر أنه مغلق. يبقى على صفحة تسجيل الدخول |
التجاوز نفسه مع تثبيت web-auth/webauthn-lib | WebauthnLibServer | مغلق. ليس هذه الثغرة المتبقية |
| تنفيذ أوامر على نظام التشغيل / صدفة عكسية | هذه الثغرة المتبقية | مغلق |
مغلق في هذه الثغرة المتبقية: PMA غير المُصادَق، وصدفة PHP على المضيف، ومعاملة حزمة tarball ثبّتت فعليًا web-auth/webauthn-lib على أنها هذه الثغرة.
قرأت createServer، ثم parseAndValidateAssertionResponse، ثم اختبار الوحدة الذي لا يمرر مفتاحًا عامًا. الفحوصات البنيوية حقيقية. يتم تحليل التوقيع وتجاهله.
محاولات خاطئة: إرسال JSON الخاص بـ WebAuthn عبر POST دون جلسة كلمة مرور سابقة؛ توقيع فشل في الفحوصات البنيوية؛ Webauthn\Server لا يزال موجودًا (صنف خادم خاطئ)؛ تحدي ليس من هذه الجلسة؛ عدم تطابق مضيف الأصل؛ علم حضور المستخدم غير مُفعَّل؛ معرّف اعتماد غير موجود في allowCredentials.
يقوم Dockerfile المخبري بنسخ 5.2.3، ثم composer install --no-dev، ثم يحذف vendor/web-auth بحيث يكون CustomServer هو المستخدم. يخرج آخر أمر php -r بالرمز 1 إذا كان Webauthn\Server موجودًا. يسجّل init.sql المصادقة الثنائية WebAuthn للمستخدم appuser دون مفتاح عتاد. يرسل PoC التوقيع not-a-real-signature-PMA-WEBAUTHN-BYPASS عبر POST.
استنسخ الإصدار المثبّت بجوار Dockerfile، ثم شغّل:
cd lab
git clone --depth 1 --branch RELEASE_5_2_3 https://github.com/phpmyadmin/phpmyadmin.git src
./run.sh
أو من جذر الحزمة بعد ذلك الاستنساخ:
python3 phpmyadmin-webauthn-Abraxas-Labs.py
للاسترجاع المحلي فقط: http://127.0.0.1:18080. مشروع Compose pma-webauthn-lab. ثبّت RELEASE_5_2_3. لا تُشحن src/. الشاهد PMA-WEBAUTHN-BYPASS.
SUCCESS PMA-WEBAUTHN-BYPASS WebAuthn 2FA accepted with garbage signature
تحقّق من authenticatorData || SHA-256(clientDataJSON) باستخدام مفتاح COSE العام المخزَّن؛ واربط userHandle؛ وطبّق signCount. اجعل web-auth/webauthn-lib تبعية حقيقية واحذف CustomServer، أو افشل بشكل مغلق إذا كانت المكتبة مفقودة. حتى ذلك الحين، عطّل المصادقة الثنائية WebAuthn 2FA أو لا تعرّض phpMyAdmin هذا.
Plugins\TwoFactor\WebAuthn::createServerCustomServer::parseAndValidateAssertionResponseGNU Affero GPL v3.0. راجع LICENSE. للاستخدام في مختبر loopback فقط. دون أي ضمان.