InfiniteWP是一款wordpress站点管理插件,通过在server端安装admin panel插件来对安装了client插件的客户端进行管理,管理的权限基本相当于管理员权限。server端的管理页面如下图所示
这个漏洞导致绕过安装了client插件的wp系统的权限认证,直接登陆后台,CVSS的评分为9.8。
限制
1.知道管理员用户名
2.InfiniteWP Client version < 1.9.4.5
首先下载新版本与旧版本进行diff来找一下补丁的位置,发现只有下面一处修改
以此大概推断,当$action
的值是add_site或readd_site时可能会触发漏洞。
在插件主文件wp-content/plugins/iwp-client/init.php
中有一个函数iwp_mmb_parse_request()
会在最后进行调用,这个函数用于解析请求,包括action解析和鉴权。
function iwp_mmb_parse_request(){
...
if (isset($iwp_action) && $iwp_action != 'restoreNew') {
...
if ($action == 'add_site') {
$params['iwp_action'] = $action;
$iwp_mmb_core->request_params = $params;
return;
}elseif ($action == 'readd_site') {
$params['id'] = $id;
$params['iwp_action'] = $action;
$params['signature'] = $signature;
$iwp_mmb_core->request_params = $params;
return;
}
$auth = $iwp_mmb_core->authenticate_message($action . $id, $signature, $id);
if ($auth === true) {
... 认证成功
} else {
iwp_mmb_response($auth, false); //认证失败,直接返回
}
...
这里的有个逻辑错误,程序先检测$action
的值是否是add_site
或readd_site
,然后再调用authenticate_message()
进行鉴权,鉴权失败则直接调用iwp_mmb_response()
进行exit()。可是注意上面的if语句,当$action
的值是add_site
或readd_site
时是直接return的,也就是说会bypass掉后面这个鉴权操作。
通过查看add_site, readd_site
对应的方法,发现方法中通过ssl签名来进行校验,因此这两个方法不放在鉴权部分中是正常的。
那漏洞点在哪?当我调试完请求包后发现,响应包直接返回了set-cookie
头,用这个cookie可以直接访问后台。
通过阅读源码,原来iwp_mmb_set_request()
调用了进行了setcookie
function iwp_mmb_set_request(){
...
if(isset($params['username']) && !is_user_logged_in()){
$user = function_exists('get_user_by') ? get_user_by('login', $params['username']) : iwp_mmb_get_user_by( 'login', $params['username'] );
...
if($isHTTPS){
wp_set_auth_cookie($user->ID);
}else{
wp_set_auth_cookie($user->ID, false, false);
wp_set_auth_cookie($user->ID, false, true);
}
可以看到,当用户传来的参数中有username键并且is_user_logged_in()
返回false时,根据username来调用get_user_by()
获取user model,最后调用wp_set_auth_cookie()
设置cookie。这里直接通过用户传来的username来进行set cookie,没有任何的密码验证等鉴权操作。可以看出开发者认为程序走到这里一定是经过了前面的鉴权的,因此这里就没有“再做一次”。
在set cookie前对$action
进行了一次硬编码
判断
这个漏洞由两部分组成,第一部分是‘证书校验’不需要进行鉴权操作,这本不算漏洞,可是第二部分直接根据username参数返回user cookie,未进行任何权限判断,这才造成了漏洞。一般来说鉴权部分和set cookie部分应该是合并在一个逻辑里的,这样才不容易出错。这里由于模块化设计,两部分的安全逻辑不一致,从而导致了这个漏洞。
Critical Authentication Bypass Vulnerability in InfiniteWP Client Plugin