
phpMyAdmin 5.2.3 - عالي - عن بُعد - SQLi - ImportLdi TERMINATED BY leftover
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-importldi
المقال التقني: https://abraxaslabs.tech/research/phpmyadmin-importldi
الفئة: SQLi الوصول: عن بُعد
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
يبني ImportLdi.php عبارة LOAD DATA مع FIELDS/LINES TERMINATED BY من حقلي POST وهما ldi_terminated وldi_new_line. يُدمج هذان النصان داخل SQL محاط بعلامات اقتباس مفردة. أما ldi_enclosed وldi_escaped فيمرّان عبر escapeString. ويقوم phpMyAdmin بتعيين PMA_ENABLE_LDI على المسار /import بحيث يكون MYSQLI_OPT_LOCAL_INFILE مُفعّلًا.
يقوم مستخدم مسجّل الدخول بإرسال POST يحمل format=ldi مع علامة اقتباس في ldi_terminated. تحتوي عبارة LOAD DATA الناتجة على قيمة POST الخام داخل TERMINATED BY. أي حقن SQL في اتصال المستخدم، وليس في مستخدم التحكم.
| المعرّف | لا يوجد CVE بعد |
| الفئة | SQLi |
| الوصول | عن بُعد (تسجيل دخول مُصادَق عبر الكوكيز؛ استيراد جدول، الصيغة ldi) |
| CWE | CWE-89 |
| CVSS | متوسط: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| المنتج | phpMyAdmin |
| المتأثر | 5.2.3 الوسم RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| المصادقة | تسجيل دخول مُصادَق عبر الكوكيز. استيراد جدول، الصيغة ldi |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
يمكن لمستخدم phpMyAdmin مسجّل الدخول يستطيع فتح استيراد الجدول أن يحقن SQL في LOAD DATA ... TERMINATED BY على اتصال MySQL الخاص به.
| الصلاحية | الطريقة / نقطة الوصول | الاستطلاع / السلامة / التوافر | مُثبت مختبريًا أم مُستنتج |
|---|---|---|---|
كسر النص الحرفي FIELDS TERMINATED BY | POST index.php?route=/import format=ldi ldi_terminated مع علامة اقتباس | سلامة العبارة التي يبنيها PMA | مُثبت مختبريًا. صندوق SQL في HTML: TERMINATED BY '',PMA-IMPORTLDI-WITNESS' |
إبقاء ENCLOSED BY ضمن النطاق | نفس طلب POST، علامة اقتباس في ldi_enclosed | ضابط سلبي | مُثبت مختبريًا. ENCLOSED BY مُهرَّب |
| SQL إضافي على اتصال المستخدم (INTO OUTFILE / متعدد العبارات إن كان مسموحًا) | نفس نقطة الوصول بمجرد إغلاق النص | سلامة اتصال المستخدم | مُستنتج. يتوقف المختبر عند الفاصل المكسور. الافتراضي في mysqli::query هو عبارة واحدة |
| قراءة/كتابة ملفات من جهة MySQL | نفس LOAD DATA إذا كان الحساب يملك FILE أو LOCAL INFILE إلى خادم الويب | سلامة الملفات التي يستطيع mysqld الوصول إليها | مُستنتج. غير ممنوح هنا. غير مُدّعى |
مُغلق في هذا المختبر: الوصول غير المُصادَق، مستخدم التحكم / pmadb، LFI عبر include على مستوى نظام التشغيل، والقراءة/الكتابة المقيّدة بـ FILE. المستخدم المسجّل يملك بالفعل صندوق SQL؛ هذا المتبقي هو الفاصل غير المُهرَّب داخل عبارة يبنيها PMA من أجله.
نفس التثبيت: متبقي WebAuthn CustomServer.
ثبّتُّ phpMyAdmin RELEASE_5_2_3. إن إضافات الاستيراد التي تبني LOAD DATA يدويًا تستدعي تدقيق الاقتباس. حقلان من أصل أربعة حقول فاصلة كانا مُهرَّبين. وحقلان لم يكونا كذلك:
$sql .= ' FIELDS TERMINATED BY \'' . $ldi_terminated . '\'';
...
$sql .= ' LINES TERMINATED BY \'' . $ldi_new_line . '\'';
ldi_enclosed / ldi_escaped تستدعي $dbi->escapeString. يضبط Common.php قيمة PMA_ENABLE_LDI على /import + format=ldi. المسارات GET|POST /import و GET|POST /table/import.
المنعطفات الخاطئة المسجّلة سلفًا: الادعاء بوجود LFI دون منحة FILE؛ اعتبار مربع SQL هو الاكتشاف (المتبقي هو الفاصل غير المُهرَّب الذي يدمجه PMA)؛ الادعاء بمستخدم تحكم / pmadb؛ صدفة عكسية. مسرح.
python3 phpmyadmin-importldi-Abraxas-Labs.py
# or: cd lab && ./run.sh
استهدف فقط http://127.0.0.1:19290. الصورتان phpmyadmin:5.2.3 وmysql:8.0. مشروع Compose باسم phpmyadmin-importldi. يتم تفكيك الحزمة بعد التشغيل.
تسجيل الدخول عبر ملف تعريف الارتباط. أرسل POST إلى /import مع format=ldi وعلامة اقتباس في ldi_terminated. صدر الأمر LOAD DATA LOCAL INFILE ... INTO TABLE \ldi_target` FIELDS TERMINATED BY '',PMA-IMPORTLDI-WITNESS'. العلامة نفسها في ldi_enclosedمخزّنة كـENCLOSED BYمهرّب. لا يزال التثبيت المصدري على صورة 5.2.3 يحتوي على'.$ldi_terminated.' و$dbi->escapeString($ldi_enclosed)`.
SUCCESS phpmyadmin-importldi pin=RELEASE_5_2_3 how=live TERMINATED-BY-raw ENCLOSED-escaped PMA-IMPORTLDI-WITNESS
escapeString على ldi_terminated وldi_new_line، كما هو الحال مع enclosed وescaped. تحويل skip_queries إلى عدد صحيح (Int-cast).
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Plugins/Import/ImportLdi.phpGNU Affero GPL v3.0. راجع LICENSE. للاستخدام في مختبر loopback فقط. دون أي ضمان.