InfiniteWP是一个免费的WordPress多站点管理办理方案,只须要点击一个按钮,我们就可以轻松完成多个WordPress站点的管理任务。
但是,InfiniteWP中存在一个漏洞,该漏洞许可未经身份验证的用户通过系统中某个用户的电子邮件地址进行身份验证,这个漏洞存在于InfiniteWP的密码重置机制当中。
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#