
phpMyAdmin 5.2.3 - عالي - عن بُعد - SQLi - معرّفات غير معقّمة في Designer JSON
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-designer-json-sqli
التحليل المكتوب: https://abraxaslabs.tech/research/phpmyadmin-designer-json-sqli
الفئة: SQLi الوصول: عن بُعد
phpMyAdmin 5.2.3 (الوسم RELEASE_5_2_3، الالتزام 962857e). في Designer AJAX، تقوم save_setting_value بتطبيق json_encode على كتلة الإعدادات ثم تدمجها في عبارة UPDATE/INSERT محاطة بعلامات اقتباس مفردة على رابط مستخدم التحكم. اسم المستخدم مُهرَّب. أما JSON فليس كذلك. json_encode لا يهرّب علامة الاقتباس المفردة.
يقوم مستخدم مسجّل الدخول بإرسال POST إلى index.php?route=/database/designer مع operation=save_setting_value وعلامة اقتباس في value. بعد ذلك تُنفّذ queryAsControlUser تلك السلسلة بصفتها مستخدم التحكم pma ضد pma__designer_settings. ذلك الحساب هو حساب تخزين الإعدادات، وليس صندوق SQL الخاص بالمستخدم المسجّل. تُغلّف phpMyAdmin 6.x هذه الكتلة بـ quoteString على ControlUser. أما 5.2.3 فلا تزال تدمجها خامًا.
كانت ثغرات Designer الأقدم (2016-6616، 2019-11768، 2019-18622) في اسم المستخدم / اسم قاعدة البيانات. هذا المتبقي هو عمود JSON settings_data.
| المعرّف | لا يوجد CVE بعد |
| الفئة | SQLi (مستخدم التحكم على pma__designer_settings) |
| الوصول | عن بُعد (تسجيل دخول مصادَق عبر الكوكيز؛ مع تفعيل Designer وpma__designer_settings) |
| CWE | CWE-89 |
| 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 (962857e) |
| المصادقة | تسجيل دخول مصادَق عبر الكوكيز. مع تفعيل Designer وpma__designer_settings. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:19220 فقط |
يمكن لمستخدم phpMyAdmin مسجّل الدخول يستطيع فتح Designer أن يحقن SQL بصفتها مستخدم التحكم على pma__designer_settings.
| الصلاحية | الطريقة / المسار | مُثبَت مختبريًا أم مُستنتَج |
|---|---|---|
| كسر سلسلة UPDATE/INSERT الخاصة بمستخدم التحكم (سلامة SQL في pmadb) | POST index.php?route=/database/designer مع operation=save_setting_value وعلامة اقتباس في value | مُثبَت مختبريًا. السجل العام: SET settings_data = '{"snap_line":"PMA-DESIGNER-JSON-SQLI-WITNESS'#" }' خامًا. quoteString غائبة |
اقتطاع settings_data الخاص بالمستخدم بحيث لا يبقى JSON (سلامة صفّه) | نفس POST؛ # يعلّق بقية العبارة | مُثبَت مختبريًا. كتلة appuser تحتوي على الشاهد وليست JSON صالحًا. الحفظ النظيف grid-ok اختفى |
| الكتابة فوق صفوف Designer لمستخدمين آخرين دون استعلامات مكدّسة (سلامة صف الضحية) | نفس # يعلّق WHERE username = '...' | مُثبَت مختبريًا. الصف المزروع victim {"keep":"safe"} أصبح كتلة الشاهد المقتطعة |
| عبارات إضافية بصفتها مستخدم التحكم | نفس نقطة الحقن إذا كان رابط mysqli الخاص بمستخدم التحكم يسمح بالاستعلامات المتعددة | مُستنتَج. الإعداد الافتراضي لـ mysqli::query هو استعلام واحد. غير مفعّل هنا |
الوصول إلى جداول pmadb أخرى (الإشارات المرجعية، السجل، pma__userconfig) | فقط إذا كانت الاستعلامات المكدّسة أو اختراق بأسلوب الكتابة ممكنًا | مُستنتَج. مستخدم التحكم في هذا المختبر لديه فقط DML على phpmyadmin.* |
مغلق في هذا المختبر: الوصول غير المصادَق، وصندوق SQL الخاص بـ appuser المسجّل الدخول (appdb فقط؛ appuser ليس لديه GRANT على phpmyadmin)، وصدفة نظام التشغيل، والاستعلامات المكدّسة. الميزة لا تعمل إذا كانت pmadb / إعدادات designer معطّلة (وهذا فشل، وليس هذا المتبقي).
ثمانية عمليات بحث متوازية في الشيفرة المصدرية لـ RELEASE_5_2_3. تدمج saveSetting ناتج json_encode داخل '...'. اسم المستخدم يمر عبر escapeString. الإصدار 6.x يطبّق quoteString بالفعل على هذه الكتلة. أما 5.2.3 فلا.
المنعطفات الخاطئة: الحقن في اسم المستخدم (فهو مُهرَّب)؛ توقّع #1064 (حيث يعلّق # بقية السطر، لذا يقبل MySQL جملة UPDATE المقتطعة)؛ اعتبار الاستعلامات المكدّسة مُثبتة (الإعداد الافتراضي لـ mysqli هو استعلام واحد).
python3 phpmyadmin-designer-json-sqli-Abraxas-Labs.py
أو
cd lab
./run.sh
للاسترجاع المحلي فقط: http://127.0.0.1:19220. الصور phpmyadmin:5.2.3 و mysql:8.0. مشروع Compose phpmyadmin-designer-json-sqli. الشاهد PMA-DESIGNER-JSON-SQLI-WITNESS.
SUCCESS phpmyadmin-designer-json-sqli version=5.2.3 how=live raw-concat=yes truncated=true sql-error=false quoteString=no PMA-DESIGNER-JSON-SQLI-WITNESS
quoteString(..., ControlUser) / escapeString على كتلة JSON، كما في RecentFavoriteTable::saveToDb() وphpMyAdmin 6.x على هذا العمود. لا تضع مخرجات json_encode داخل نص SQL محاط بعلامات اقتباس مفردة.
962857e)libraries/classes/Database/Designer/Common.php saveSettingControllers/Database/DesignerController.php POST operation=save_setting_valueGET|POST /database/designerGNU Affero GPL v3.0. راجع LICENSE. للاستخدام في مختبر loopback فقط. دون أي ضمان.