
phpMyAdmin 5.2.3 - عالي - عن بُعد - متبقٍّ - تم تخطي فحص isSuperUser
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-issuperuser
التقرير: https://abraxaslabs.tech/research/phpmyadmin-issuperuser
الفئة: صلاحية متبقية الوصول: عن بُعد
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
DatabaseInterface::isSuperUser() ليست فحصًا لـ SUPER / SYSTEM_USER. إنها SELECT 1 FROM mysql.user LIMIT 1. أي حساب يستطيع قراءة mysql.user يُخزَّن مؤقتًا كـ superuser لبقية الجلسة. القيمة الافتراضية لـ $cfg['AllowUserDropDatabase'] هي false. تأخذ كلٌّ من DestroyController وSqlController وImportController وصفحة قواعد البيانات اختصار isSuperUser متجاوزةً بذلك هذا الإعداد.
تجاوز لسياسة phpMyAdmin، وليس صلاحية MySQL جديدة. SELECT على mysql.user مع DROP، وبدون SUPER، كافٍ لتنفيذ Drop عبر PMA.
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية |
| الوصول | عن بُعد (تسجيل دخول مُصادَق عبر الكوكيز بحساب MySQL) |
| CWE | CWE-863 |
| CVSS | متوسط: 6.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L |
| المنتج | phpMyAdmin |
| المتأثر | 5.2.3 وسم RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| المصادقة | تسجيل دخول مُصادَق عبر الكوكيز بحساب MySQL |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
حساب MySQL مسجَّل الدخول يستطيع قراءة mysql.user (وهو SELECT نموذجي لحسابات النسخ الاحتياطي/المراقبة) بالإضافة إلى DROP، وبدون SUPER، يُعامَل كـ superuser في phpMyAdmin.
| الصلاحية | الطريقة / نقطة الوصول | استطلاع / سلامة / إتاحة | مُثبَت مختبريًا أو مُستنتَج |
|---|---|---|---|
تجاوز $cfg['AllowUserDropDatabase']=false ورؤية Drop في صفحة قواعد البيانات | GET index.php?route=/server/databases | استطلاع لواجهة Drop | مُثبَت مختبريًا. bulkActionDropButton / selected_dbs[] موجودة لـ selectuser؛ وغائبة لـ plaindrop |
| إسقاط قاعدة بيانات عبر معالج destroy في PMA | POST index.php?route=/server/databases/destroy selected_dbs[]=dropme ajax_request=true | سلامة / إتاحة تلك القاعدة | مُثبَت مختبريًا. JSON success:true، "1 database has been dropped successfully." اختفت dropme |
تنفيذ DROP DATABASE من مربع SQL | POST index.php?route=/sql sql_query=DROP DATABASE \dropme_sql`` | سلامة / إتاحة تلك القاعدة | مُثبَت مختبريًا. اختفت القاعدة. الحساب السلبي يحصل على "DROP DATABASE statements are disabled." |
فتح شاشات PMA أخرى مشروطة بـ isSuperUser() | Privileges، replication، status، user groups، engines، binlog، variables | استطلاع / سلامة لتلك الشاشات | مُستنتَج من مواضع الاستدعاء. لم يُختبر |
قراءة mysql.user | SELECT في MySQL الذي يستخدمه PMA كأداة تحقق SUPER | استطلاع للكتالوج الذي يخلط PMA بينه وبين SUPER | مُثبَت مختبريًا. هذا المنح هو ما تخلط الصلاحية المتبقية بينه وبين SUPER |
مغلق في هذا المختبر: SUPER الحقيقي في MySQL (SHOW GRANTS يبقى USAGE + DROP على الجدول + SELECT على mysql.user). FILE وGRANT OPTION والإيقاف وALL PRIVILEGES غير ممنوحة. الحساب الذي يملك DROP لكن دون SELECT على mysql.user لا يزال غير قادر على الإسقاط عبر PMA. هذه ليست صلاحية MySQL جديدة وليست RCE.
نفس التثبيت: بقايا WebAuthn CustomServer.
ثبّتُ إصدار phpMyAdmin RELEASE_5_2_3. بوابات الصلاحيات التي تتحدث بأسلوب SUPER يجب أن تبدو مثل SUPER. هذه البوابة تبدو كاستعلام SELECT على الكتالوج:
$result = $this->tryQuery('SELECT 1 FROM mysql.user LIMIT 1');
$isSuperUser = false;
if ($result) {
$isSuperUser = (bool) $result->numRows();
}
SessionCache::set('is_superuser', $isSuperUser);
البوابات التي تأخذ هذا العلم حول AllowUserDropDatabase (الافتراضي false):
Controllers/Server/DatabasesController.php is_drop_allowedControllers/Server/Databases/DestroyController.php (AJAX destroy)Controllers/Sql/SqlController.php / Sql::hasNoRightsToDropDatabaseControllers/Import/ImportController.phpControllers/Database/OperationsController.phpالمنعطفات الخاطئة المسجّلة سلفًا: الادعاء بامتلاك صلاحية MySQL SUPER الحقيقية؛ اعتبار حساب مخصّص لـ DROP فقط هو الخلل (ذلك الحساب هو الضابط السلبي)؛ تضخيم الأمر إلى RCE؛ صدفة عكسية. مسرح.
python3 phpmyadmin-issuperuser-Abraxas-Labs.py
# or: cd lab && ./run.sh
استهدف فقط http://127.0.0.1:19270. الصورتان phpmyadmin:5.2.3 وmysql:8.0. مشروع Compose باسم phpmyadmin-issuperuser. $cfg['AllowUserDropDatabase']=false. تُفكَّك الحزمة بعد التشغيل.
يمتلك selectuser صلاحية SELECT على mysql.user بالإضافة إلى DROP على dropme / dropme_sql، دون SUPER. ويمتلك plaindrop صلاحية DROP على nodropme فقط. تعرض صفحة قواعد البيانات زر Drop لـ selectuser. يُسقط POST إلى /server/databases/destroy قاعدة dropme. كما يُنفَّذ POST إلى /sql مع DROP DATABASE dropme_sql. ومع ذلك، تلقّى plaindrop استجابة JSON الخاصة بالخطأ من destroy، ورسالة "DROP DATABASE statements are disabled" من /sql.
SUCCESS phpmyadmin-issuperuser drop-ui=yes destroy=ok sql-drop=ok grants-no-super=yes mysql.user-select=yes neg-drop-ui=no neg-destroy=denied PMA-ISSUPERUSER-WITNESS
تحقّق من SUPER / SYSTEM_USER الحقيقيين عبر INFORMATION_SCHEMA أو SHOW GRANTS. احتفظ بعلم منفصل باسم "can read mysql.user" لواجهة المستخدم التي تحتاج فعليًا إلى ذلك الكتالوج. لا تخزّن نتيجة استعلام SELECT على الكتالوج مؤقتًا بصفة superuser.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/DatabaseInterface.php isSuperUser()GNU Affero GPL v3.0. راجع LICENSE. للاستخدام في مختبر loopback فقط. دون أي ضمان.