
phpMyAdmin 5.2.3 - عالي - عن بُعد - متبقٍ - لا يزال setup/validate قابلاً للوصول
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-setup-validate
المقال: https://abraxaslabs.tech/research/phpmyadmin-setup-validate
الفئة: SSRF الوصول: عن بُعد
phpMyAdmin 5.2.3 (الوسم RELEASE_5_2_3، الالتزام 962857e). يتوقف setup/index.php عن العمل عند وجود config.inc.php. أما setup/validate.php فلا. فهو لا يزال يُحمَّل ضمن $isMinimumCommon، ويأخذ رمز CSRF من صفحة تسجيل الدخول العامة، ويستدعي Validator::testDBConnection -> mysqli_connect إلى المضيف والمنفذ والمستخدم وكلمة المرور الموجودة في حقل JSON باسم values.
يقوم عميل غير مُصادَق عليه بإرسال GET إلى / للحصول على ملف تعريف ارتباط للجلسة ورمز، ثم يرسل POST إلى setup/validate.php بالقيمة id=Server مع Servers/1/host وServers/1/port حسب اختياره. يفتح مضيف phpMyAdmin مصافحة TCP لبروتوكول MySQL إلى ذلك العنوان. هذا هو SSRF عبر بروتوكول MySQL: منفذ 3306 الداخلي، وحشو بيانات الاعتماد ضد خادم داخلي، ومسبار للمنافذ من التوقيت وأخطاء mysqli. وهو ليس SSRF لبيانات HTTP الوصفية إلا إذا كان هناك شيء على ذلك المنفذ يتحدث MySQL. كما يُدرج hide_db تعبيرًا نمطيًا للمستخدم في preg_match. لم أُشغّل مسار ReDoS هذا في هذا المختبر.
تحذف صورة phpmyadmin:5.2.3 الرسمية مجلد setup/. هذا المخلف ينطبق فقط عندما يظل ذلك المجلد في جذر الويب، وهو المخلف الشائع بعد التثبيت. يستعيد المختبر مجلد setup/ من أرشيف 5.2.3 بحيث يتطابق التثبيت مع RELEASE_5_2_3.
غطّى PMASA-2016-44 / CVE-2016-6621 بعض حالات SSRF في setup. لم يُطبَّق فحص "تعطيل setup عند وجود config" قط على validate.php / config.php.
| المعرّف | لا يوجد CVE بعد |
| الفئة | SSRF (بروتوكول MySQL) |
| الوصول | عن بُعد (غير مُصادَق عليه إذا كان setup/ لا يزال متاحًا عبر الويب) |
| CWE | CWE-918 |
| CVSS | عالٍ: 7.2 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N |
| المنتج | phpMyAdmin |
| المتأثر | 5.2.3 الوسم RELEASE_5_2_3 (962857e) مع بقاء setup/ في جذر المستندات |
| المصادقة | غير مُصادَق عليه. رمز CSRF من صفحة تسجيل الدخول العامة. لا تسجيل دخول إلى MySQL. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:19230 فقط |
يمكن لأي شخص يستطيع الوصول إلى شجرة setup/ المتبقية أن يجعل مضيف phpMyAdmin يفتح اتصال TCP ببروتوكول MySQL إلى مضيف ومنفذ يختارهما هو.
| الصلاحية | الطريقة / المسار | مُثبت في المختبر أم مُستنتج |
|---|---|---|
| فتح TCP من مضيف PMA إلى مضيف:منفذ المهاجم (سلامة الاتصال الصادر؛ استطلاع ذلك المنفذ) | POST /setup/validate.php غير مُصادَق عليه بالقيمة id=Server مع Servers/1/host + Servers/1/port بالإضافة إلى رمز من GET / | مُثبت في المختبر. سجّل المسبار على oracle:13306 القيمة PMA-SETUP-VALIDATE-WITNESS من حاوية PMA |
| تأكيد أن واجهة setup معطّلة بينما يبقى validate مفعّلًا | GET /setup/index.php | مُثبت في المختبر. يحتوي النص على "setup is disabled" / configuration already exists |
| الفشل الآمن دون رمز CSRF الخاص بصفحة تسجيل الدخول | نفس طلب POST، بدون token | مُثبت في المختبر. صفر إصابات على المسبار |
| مسبار للمنفذ / بيانات الاعتماد من أخطاء mysqli والتوقيت | نفس testDBConnection | مُستنتج. كان نص المختبر mysqli_connect(): (HY000/2006): MySQL server has gone away بعد أن قبل المسبار ثم أغلق |
| التحدث بـ MySQL إلى منفذ 3306 داخلي ومحاولة المستخدم/كلمة المرور المُرسَلين | نفس mysqli_connect | مُستنتج. لم يُوجَّه إلى خدمة db في المختبر |
ReDoS عبر validateRegex الذي يُدرج تعبيرًا نمطيًا للمستخدم | id=Servers/1/hide_db | مُستنتج. لم يُجرَّب |
مغلق في هذا المختبر: SSRF لبيانات HTTP الوصفية (المصافحة هي MySQL، وليست GET /latest/meta-data)، وتسجيل دخول PMA بدون مصادقة، وقشرة نظام التشغيل، ومعالج الإعداد نفسه (index.php يبقى معطلاً). FAIL إذا لم يتم نشر setup/ (الافتراضي في الصورة الرسمية).
ثماني عمليات بحث متوازية في المصدر لـ RELEASE_5_2_3. يحتوي setup/index.php على الخطأ القاتل الخاص بوجود الإعدادات. أما setup/validate.php فلا يحتوي عليه. ويضبط setup/lib/common.inc.php المتغير $isMinimumCommon ولا يبحث عن CONFIG_FILE.
مسارات خاطئة: التعامل مع الصورة الرسمية على أنها هذه البقايا (فهي تحذف setup/)؛ إرسال POST دون رمز صفحة تسجيل الدخول (صفر إصابات في الـ oracle)؛ التعامل مع هذا على أنه SSRF لبيانات HTTP الوصفية (المصافحة هي MySQL).
python3 phpmyadmin-setup-validate-Abraxas-Labs.py
أو
cd lab
./run.sh
للاسترجاع المحلي فقط: http://127.0.0.1:19230. مشروع Compose phpmyadmin-setup-validate. يستعيد Dockerfile مجلد setup/ من أرشيف 5.2.3 tarball ويشغّل أوراكل TCP على المنفذ 13306. الشاهد PMA-SETUP-VALIDATE-WITNESS.
SUCCESS phpmyadmin-setup-validate how=live tcp=yes setup-index-disabled=yes PMA-SETUP-VALIDATE-WITNESS
ضع الخطأ القاتل file_exists(CONFIG_FILE) في setup/lib/common.inc.php بحيث تتوقف كل سكربتات الإعداد. قيّد مضيفي testDBConnection. لا تبنِ محددات preg_match من سلاسل المستخدم.
962857e)setup/index.php خطأ قاتل عند وجود الإعداداتsetup/validate.php لا يحتوي على ذلك الفحصlibraries/classes/Config/Validator.php testDBConnection / mysqli_connectGNU Affero GPL v3.0. راجع LICENSE. للاستخدام في مختبر loopback فقط. دون أي ضمان.