با بروز رسانی افزونه Easy WP SMTP

با بروز رسانی افزونه Easy WP SMTP

با بروز رسانی افزونه Easy WP SMTP با بروز رسانی افزونه Easy WP SMTP به تازگی حملاتی به سایت‌های وردپرسی مشاهده شده که پس از تحقیق و بررسی‌های پیاپی مشکل کشف شد. این مشکلات از سمت افزونه Easy WP SMTP است که سایت وردپرسی را در معرض خطر حمله با تزریق کدهای مخرب در آن، قرار می‌دهد. […]

با بروز رسانی افزونه Easy WP SMTP

با بروز رسانی افزونه Easy WP SMTP

به تازگی حملاتی به سایت‌های وردپرسی مشاهده شده که پس از تحقیق و بررسی‌های پیاپی مشکل کشف شد. این مشکلات از سمت افزونه 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' ]            = 1;
$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 را برای اجرای عملکرد بالا دارند. همین امر خطر حمله به وردپرس را به وجود می‌آورد.

با بروز رسانی افزونه Easy WP SMTP