漏洞概述
近期,研究人员在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)生成的值,就能够创建出重置密码的链接。
通过创建包含所有可能的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
#