Trở về

Lỗ hổng nghiêm trọng trong plugin WordPress Easy WP SMTP

bởi Vi Nè

Plugin Easy WP SMTP phổ biến , với hơn 300.000 cài đặt hoạt động, dễ bị lỗ hổng zero-day nghiêm trọng cho phép người dùng không được xác thực sửa đổi các tùy chọn WordPress hoặc tiêm và thực thi mã trong số các hành động độc hại khác.

Lỗ hổng zero-day nghiêm trọng trong plugin WordPress Easy WP SMTP – Ảnh: muatheme.com

Lỗ hổng được tìm thấy trong phiên bản v1.3.9, đã bị tin tặc khai thác kể từ ít nhất là ngày 15 tháng 3 và đã bị bắt bởi Tường lửa ứng dụng web cho WordPress, NinjaFirewall (Phiên bản WP).

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();
    }
  }
}

Hàm admin_init(), từ easy-wp-smtp.php, được chạy qua admin_inithook khi người dùng truy cập vào khu vực quản trị. Nó được sử dụng để xem/xóa nhật ký, nhập/xuất cấu hình plugin và cập nhật các tùy chọn trong cơ sở dữ liệu WordPress.

Lưu ý: Điều này không chỉ chạy trên màn hình quản trị người dùng. Nó cũng chạy trên admin-ajax.phpadmin-post.php.

Do đó, người dùng không được xác thực có thể gửi yêu cầu AJAX, ví dụ action=swpsmtp_clear_log, để kích hoạt chức năng trên và thực thi mã của nó.

Các lỗ hổng khác có thể bị khai thác như:

  • Thực thi mã từ xa thông qua PHP Object Injection vì với Easy WP SMTP sử dụng các unserialize() không an toàn.
  • Xem/xóa nhật ký (hoặc bất kỳ tệp nào).
  • Xuất cấu hình plugin bao gồm máy chủ SMTP, tên người dùng và mật khẩu và sử dụng nó để gửi email spam.

Nếu bạn đang sử dụng phiên bản dễ bị xâm hại của Easy WP SMTP, hãy kiểm tra:

  • Kiểm tra Cài đặt: Đi đến Dashboard > General để kiểm tra và đảm bảo không có gì bị giả mạo (URL, Địa chỉ email, Tư cách thành viên và Vai trò mặc định của người dùng mới).
  • Kiểm tra người dùng: Tìm kiếm người dùng mới, tài khoản quản trị lạ, kiểm tra địa chỉ email quản trị viên, v.v.
  • Thay đổi tất cả mật khẩu.
  • Kiểm tra bảng WordPress wp_options* của bạn trong cơ sở dữ liệu: Đảm bảo wp_user_roles* vẫn bình thường.
  • Quét các tập tin của bạn kỹ lưỡng.
  • Thay đổi mật khẩu SMTP của bạn, tin tặc có thể đã đánh cắp nó.
  • Nếu bạn đã thay đổi tiền tố cơ sở dữ liệu WordPress của mình, hãy thay thế wp_ bằng tiền tố khác.

Trên là một số thông tin về cuộc tấn công thông qua plugin và một số cách giải quyết tạm thời, chúng tôi khuyên bạn nên cập nhật bản mới nhất để được NPH plugin sửa lỗi.

Chúng tôi tạm dừng chức năng bình luận, mọi thắc mắc vui lòng gửi thông qua mục liên hệ. Xin cám ơn!