玖叶教程网

前端编程开发入门

InfiniteWP管理面板中的身份绕过和远程代码执行RCE

漏洞概述

近期,研究人员在InfiniteWP中发现了一个安全漏洞,这个漏洞存在于InfiniteWP的密码重置机制之中,一旦成功利用该漏洞,未经身份验证的用户将能够绕过身份验证限制,并实现远程代码执行。

InfiniteWP是一个免费的WordPress多站点管理解决方案,只需要点击一个按钮,我们就可以轻松完成多个WordPress站点的管理任务。

但是,InfiniteWP中存在一个漏洞,该漏洞允许未经身份验证的用户通过系统中某个用户的电子邮件地址进行身份验证,这个漏洞存在于InfiniteWP的密码重置机制当中。

CVE编号

CVE-2020-28642

修复版本

Infinite WP 2.15.7及其更新版本

注意:官方悄悄修复了该漏洞,并且没有记录在更新日志之中,Infinite WP 2.15.7及其更新版本都不会受此漏洞的影响。

厂商回应

当我们在2020年9月通知供应商时,他们说他们之前已经知道了这个问题(几个月前向他们报告过),他们计划在3-4周内向所有用户发布补丁。他们让我们等到2021年1月,这样他们就可以确认他们所有的客户都已经修复了该漏洞。

几天前,我们发现其他研究人员已经发表了他的研究结果(大约在2020年11月),而供应商没有及时通知我们这一点,因此我们决定发布关于该漏洞的完整信息。

漏洞分析

一、弱密码重置令牌

InfiniteWP管理员面板负责创建密码重置链接,负责该功能的代码存在于userLoginResetPassword($params)函数之中,该函数位于controllers/appFunctions.php文件的第1341行代码处:

$hashValue = serialize(array('hashCode' => 'resetPassword', 'uniqueTime' => microtime(true), 'userPin' => $userDets['userID']));

$resetHash = sha1($hashValue);

[...]

$verificationURL = APP_URL."login.php?view=resetPasswordChange&resetHash=".$resetHash."&transID=".sha1($params["email"]);

这里的$userDets[‘userID’] 是目标用户识别符,$params[“email”]则是用户的电子邮件地址。在重置目标用户密码的时候,攻击者只需要目标用户的ID、电子邮件和调用microtime(true)生成的值,就能够创建出重置密码的链接。

  • 用户ID是存储在数据库中的自动递增整数,默认值为1。那么,为了拥有更多的用户,就需要购买“manage users”插件(https://infinitewp.com/docs/addons/manage-users/)。也就是说,我们所使用的攻击脚本默认将尝试从1到5的用户ID值;
  • 攻击者可以在攻击发生之前测试用户电子邮件,如果输入的电子邮件未注册,程序则会返回不同的HTTP响应信息,即返回一个HTTP重定向,重定向地址为“php?view=resetPassword&errorMsg=resetPasswordEmailNotFound”,表示电子邮件未注册。如果输入的电子邮件未注册,攻击脚本会自动发出通知。
  • Microtime(true)生成的值为当前的UNIX时间戳,以微秒为单位(php.net/microtime)。因此,看可以使用HTTP “Date”Header值(精度为秒)作为字典来进行暴力破解。
  • 通过创建包含所有可能的resetHash值的字典列表,我们可以爆破出正确的密码重置令牌并重置目标用户的密码。在24小时内最多可以尝试100万次爆破攻击,不过密码重置令牌将在24小时后将会过期。

    在进行漏洞利用PoC的测试过程中,攻击所耗的平均时间为1个小时左右,也就是说,根据特定的网络速度、拥塞和配置,攻击所花的时间可能会不同。

    此时,攻击者将能够重置目标用户的密码并访问InfiniteWP管理面板。而下一个漏洞将允许攻击者在目标主机上实现经过身份验证的远程代码执行。

    二、通过”addFunctions”绕过”checkDataIsValid”实现远程代码执行

    早在2016年的时候,研究人员就曾在InfiniteWP管理员面板的2.8.0版本中发现了一个远程代码执行漏洞,这个漏洞将影响/ajax.php API节点。关于该漏洞的详细信息可以参考这篇【文档】。正如报告中所写,新版本通过添加了一个针对函数checkDataIsValid($action)(位于controllers/panelRequestManager.php的第3782行)的调用来修复了该漏洞。

    private static function checkDataIsValid($action){
    
        //Restricted function access
    
        $functions = array('addFunctions');
    
        if(!in_array($action, $functions)){
    
            return true;
    
        }
    
        return false;
    
    }

    但是,该检查没有考虑到PHP函数名不区分大小写的问题,因此通过使用addfunctions(注意小写的“f”),可以绕过这个补丁并实现远程代码执行了。

    漏洞利用演示

    漏洞利用代码PoC

    #!/usr/bin/env python3
    
    # coding: utf8
    
    #
    
    # exploit code for unauthenticated rce in InfiniteWP Admin Panel v2.15.6
    
    #
    
    # tested on:
    
    # - InfiniteWP Admin Panel v2.15.6 released on August 10, 2020
    
    #
    
    # the bug chain is made of two bugs:
    
    # 1. weak password reset token leads to privilege escalation
    
    # 2. rce patch from 2016 can be bypassed with same payload but lowercase
    
    #

    发表评论:

    控制面板
    您好,欢迎到访网站!
      查看权限
    网站分类
    最新留言