Wordpress InfiniteWP Client插件 认证绕过

0x00 前言

InfiniteWP是一款wordpress站点管理插件,通过在server端安装admin panel插件来对安装了client插件的客户端进行管理,管理的权限基本相当于管理员权限。server端的管理页面如下图所示

这个漏洞导致绕过安装了client插件的wp系统的权限认证,直接登陆后台,CVSS的评分为9.8。

限制
1.知道管理员用户名
2.InfiniteWP Client version < 1.9.4.5

0x01 分析

首先下载新版本与旧版本进行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_sitereadd_site,然后再调用authenticate_message()进行鉴权,鉴权失败则直接调用iwp_mmb_response()进行exit()。可是注意上面的if语句,当$action的值是add_sitereadd_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,没有任何的密码验证等鉴权操作。可以看出开发者认为程序走到这里一定是经过了前面的鉴权的,因此这里就没有“再做一次”。

0x02 补丁

在set cookie前对$action进行了一次硬编码判断

0x03 总结

这个漏洞由两部分组成,第一部分是‘证书校验’不需要进行鉴权操作,这本不算漏洞,可是第二部分直接根据username参数返回user cookie,未进行任何权限判断,这才造成了漏洞。一般来说鉴权部分和set cookie部分应该是合并在一个逻辑里的,这样才不容易出错。这里由于模块化设计,两部分的安全逻辑不一致,从而导致了这个漏洞。

0x04 参考

Critical Authentication Bypass Vulnerability in InfiniteWP Client Plugin

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖