
phpMyAdmin 5.2.3 - عالي - عن بُعد - متبقٍ - لا يزال setup/validate قابلاً للوصول
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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 إلى المضيف والمنفذ والمستخدم وكلمة المرور الموجودة في حقل values بصيغة JSON.
يقوم عميل غير مُصادَق عليه بإرسال GET إلى / للحصول على ملف تعريف الجلسة والرمز، ثم يرسل POST إلى setup/validate.php بالقيمة id=Server مع Servers/1/host و Servers/1/port حسب اختياره. يفتح مضيف phpMyAdmin مصافحة MySQL عبر TCP إلى ذلك العنوان. هذا هو 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 في الإعداد. لم يُطبَّق فحص "تعطيل الإعداد عند وجود الإعدادات" أبدًا على 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 |
| تأكيد أن واجهة الإعداد معطّلة بينما يبقى validate مفعّلًا | GET /setup/index.php | مُثبَت في المختبر. يحتوي النص على "setup is disabled" / الإعدادات موجودة بالفعل |
| الفشل الآمن دون رمز 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 بدون رمز صفحة تسجيل الدخول (صفر إصابات على الكاشف)؛ اعتبار هذا 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 ويشغّل كاشف 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. مختبر استرجاع محلي فقط. بدون ضمان.