
phpMyAdmin 5.2.3 - عالي - عن بُعد - SQLi - معرّفات غير معقّمة في Designer JSON
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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
Loopback فقط: 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 فقط. دون أي ضمان.