
استغلال تنفيذ تعليمات برمجية عن بعد مع المصادقة لمكون ووردبريس Elementor (الإصدارات 3.6.0-3.6.2) عبر رفع ملف PHP تعسفي. يتضمن استرداد nonce وتغليف حمولة ZIP لاختبار الاختراق.
Google Dork: none
Date: April 16 2022
Exploit Author: AkuCyberSec (https://github.com/AkuCyberSec)
Vendor Homepage: https://elementor.com/
Software Link: https://wordpress.org/plugins/elementor/advanced/ (scroll down to select the version)
Version: 3.6.0, 3.6.1, 3.62
Tested on: WordPress 5.9.3 (os-independent since this exploit does NOT provide the payload)
CVE : CVE-2022-1329
إضافة ووردبريس المسماة Elementor (الإصدارات 3.6.0، 3.6.1، 3.6.2) تحتوي على ثغرة تسمح لأي مستخدم مصادق برفع وتنفيذ أي ملف PHP.
هذه الثغرة، في قائمة OWASP TOP 10 لعام 2021، تحتل المرتبة #1 (التحكم في الوصول المكسور).
الملف الذي يحتوي على هذه الثغرة هو elementor/core/app/modules/onboarding/module.php.
في نهاية هذا الملف يمكنك العثور على هذا الكود:
add_action( 'admin_init', function() {
if ( wp_doing_ajax() &&
isset( $_POST['action'] ) &&
isset( $_POST['_nonce'] ) &&
wp_verify_nonce( $_POST['_nonce'], Ajax::NONCE_KEY )
) {
$this->maybe_handle_ajax();
}
} );
يتم تشغيل هذا الكود عندما يزور أي حساب مستخدم /wp-admin.
لكي تعمل الثغرة، نحتاج إلى الأشياء الأربعة التالية:
wp_doing_ajax()) ويجب أن تكون الطريقة POST. للقيام بذلك، نحتاج فقط إلى استدعاء /wp-admin/admin-ajax.php."elementor_upload_and_install_pro" (تحقق من الدالة المسماة maybe_handle_ajax() في نفس الملف)./wp-admin (يقوم هذا الاستغلال بذلك في دالة DoLogin)."fileToUpload" على أرشيف ZIP الذي نريد رفعه (تحقق من الدالة المسماة upload_and_install_pro() في نفس الملف).يجب أن يكون للملف الذي نرفعه الهيكل التالي:
"elementor-pro"."elementor-pro.php".هذا الملف سيكون الحمولة الخاصة بك (على سبيل المثال، PHP Reverse Shell أو أي شيء آخر).
تحذير: الإضافة المزيفة التي نرفعها سيتم تفعيلها بواسطة Elementor، مما يعني أنه في كل مرة نزور فيها أي صفحة نقوم بتفعيل حمولتنا.
إذا حاولت، على سبيل المثال، الاتصال بمضيف غير متصل، فقد يؤدي ذلك إلى تعطيل الخدمة.
لمنع ذلك، أقترح عليك استخدام متغير لتفعيل الحمولة.
شيء كهذا (قم بزيارة anypage.php?activate=1 للمتابعة مع الحمولة الفعلية):
if (!isset($_GET['activate']))
return;