21/03/2019
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 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.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ó.
Các lỗ hổng khác có thể bị khai thác như:
unserialize()
không an toàn.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:
wp_options*
của bạn trong cơ sở dữ liệu: Đảm bảo wp_user_roles*
vẫn bình thường.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.