
phpMyAdmin - High 8.1 - تجاوز المصادقة الثنائية عبر POST /index.php بعد المصادقة
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · PMA-5.2.3-WebAuthn-2FA
phpMyAdmin 5.2.3 - phpMyAdmin
حزمة tarball الافتراضية. web-auth/webauthn-lib هي suggest / require-dev. لا يقوم composer install --no-dev بتثبيتها. لذلك تستخدم createServer الصنف CustomServer. يقوم ذلك الصنف بتحليل response.signature (يجب أن يكون الحقل موجودًا وقابلًا لفك الترميز) ولا يتحقق منه عبر COSE أبدًا. ولا يستخدم أبدًا credentialPublicKey المخزَّن. ويقبل اختبار CustomServerTest الخاص بالمنتج نفسه تأكيدًا بدون مفتاح عام.
بعد كلمة مرور MySQL، فإن توقيع WebAuthn عشوائي لا يزال يطابق challenge وorigin وrpIdHash وحالة user-present يعني جلسة phpMyAdmin كاملة. أي قاعدة البيانات.
| المعرّف | لا يوجد CVE بعد |
| 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 حزمة tarball الافتراضية (web-auth/webauthn-lib غائبة) |
| المصادقة | كلمة مرور MySQL، ثم يتم تخطي WebAuthn |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
لا يزالون بحاجة إلى كلمة مرور MySQL (تسجيل الدخول عبر الكوكيز). بعد تلك الكلمة، يرسلون POST إلى webauthn_request_response مع challenge مطابق، ومضيف origin، وrpIdHash، وحالة user-present، ومعرّف الاعتماد المسجَّل، وتوقيع عشوائي. فيصلون إلى الواجهة العادية. اختفت المصادقة الثنائية. هذا تنفيذ تعليمات عن بُعد (RCE) على البيانات، وليس صدفة PHP على المضيف.
إذا كنت قد ثبّتت web-auth/webauthn-lib فعليًا، فأنت على WebauthnLibServer ولست مصابًا بهذا الخلل.
قرأت createServer، ثم parseAndValidateAssertionResponse، ثم اختبار الوحدة الذي لا يمرر مفتاحًا عامًا. الفحوصات البنيوية حقيقية: معرّف الاعتماد في allowCredentials، وclientData.type == webauthn.get، وchallenge يطابق الجلسة، ومضيف origin، وrpIdHash، وحالة user-present. يتم تحليل التوقيع وتجاهله.
أول عميل وجّهته إلى هذا كان مهذبًا. أرسل POST بـ JSON خاص بـ WebAuthn دون جلسة كلمة مرور سابقة. صفحة تسجيل الدخول. أرسل POST إلى route=/ بتوقيع لم يستوفِ حتى الفحوصات البنيوية. تبقى على المصادقة الثنائية. لا يزال webauthn_request_response موجودًا في HTML.
مسارات خاطئة مسجَّلة بالفعل: وجود Webauthn\Server (صنف خادم خاطئ)؛ challenge ليس الذي من هذه الجلسة؛ عدم تطابق مضيف origin؛ علم user-present غير مُفعَّل؛ معرّف الاعتماد ليس في allowCredentials؛ غير مصادَق، بلا كلمة مرور MySQL؛ صدفة عكسية. مسرح. العلامة الدالة هي اختفاء حقل المصادقة الثنائية وظهور صفحة تنقل phpMyAdmin.
أخطاء العميل تبدو كأخطاء المنتج. مساعد يحجب http.client لا يرسل أي حزمة أبدًا. .recv() على HTTPResponse ليست .read(). أذكر ذلك مرة واحدة لأنه كلّف وقتًا وبدا، لدقيقة، وكأن phpMyAdmin سليم.
ثم: POST باسم المستخدم/كلمة المرور/الرمز. اسحب challenge الجلسة من صفحة المصادقة الثنائية. أرسل POST بالتأكيد المزوَّر. still_2fa=False landed=True. ينسخ Dockerfile الخاص بالمختبر 5.2.3، ثم composer install --no-dev، ثم يحذف vendor/web-auth بحيث يكون CustomServer هو المستخدم. الأمر php -r الأخير يخرج بالرمز 1 إذا كان Webauthn\Server موجودًا. يجب أن تفشل الصورة في البناء إذا كانت المكتبة لا تزال موجودة. يسجّل init.sql المصادقة الثنائية عبر WebAuthn للمستخدم appuser دون مفتاح عتاد.
cd lab
./run.sh
استهدف فقط http://127.0.0.1:18080. ضع phpMyAdmin 5.2.3 كـ src/ بجوار Dockerfile أولاً.
password-login status=200 webauthn=True
2fa-post status=200 still_2fa=False landed=True
SUCCESS PMA-WEBAUTHN-BYPASS WebAuthn 2FA accepted with garbage signature
قم بتثبيت web-auth/webauthn-lib حتى يستخدم createServer المكتبة، أو قم فعليًا بالتحقق من response.signature باستخدام COSE مقابل المفتاح العام المخزّن في CustomServer. حتى ذلك الحين، عطّل المصادقة الثنائية WebAuthn 2FA أو لا تعرّض phpMyAdmin هذا.
CustomServer::parseAndValidateAssertionResponse · WebAuthn::createServer · CustomServerTestGNU Affero GPL v3.0. راجع LICENSE. للاستخدام في مختبر loopback فقط. دون أي ضمان.