Joomla提权漏洞(CVE-2020-11890)
字数 1732 2025-08-25 22:58:35
Joomla提权漏洞(CVE-2020-11890)分析报告
漏洞概述
漏洞编号:CVE-2020-11890
影响版本:Joomla! CMS 2.5.0 - 3.9.16
漏洞类型:权限提升漏洞
风险等级:低危
漏洞发现时间:2020年5月
漏洞作者:披甲熊
该漏洞允许拥有管理员(Administrator)权限的用户通过特殊构造的请求将自己提升为超级管理员(Super Users)权限。需要注意的是,利用此漏洞的前提是攻击者已经拥有一个管理员账号。
权限级别对比
在Joomla系统中存在两种高级权限:
-
超级管理员(Super Users):
- 拥有Joomla的所有权限
- 只能由另一个超级管理员创建
- 可以修改Joomla的全局设置
- 可以安装/修改模板和语言文件
- 可以将其他用户提升为超级管理员
-
高级管理员(Administrator):
- 不能将用户升级为超级用户
- 不能编辑超级用户
- 不能修改Joomla的全局设置
- 不能改变和安装模板和语言文件
漏洞原理分析
Joomla用户组树形结构
Joomla使用树形结构管理用户组权限,主要特点:
- Public是根节点,ID为1,parent_id为0
- Registered、Manager、Super Users、Guest是第二层节点
- 其他用户组(如Administrator)位于更深层次
权限检查机制
当用户尝试修改其他用户的组别时,系统会:
- 通过
getGroupPath()方法获取目标用户组的祖先路径(path) - 在
Rule.php的allow()方法中检查当前用户是否有权限操作这些组 - 对于Administrator用户,
$this->data数组包含array(8 => 1),表示禁止操作Super Users组(ID为8)
漏洞触发点
漏洞利用的关键在于:
- 修改Public节点的parent_id为一个不存在的值(如100)
- 这导致
getGroupPath()计算路径时出错,所有节点的path变为null - 权限检查时由于path为null,无法正确比对禁止操作的组别
- 从而绕过权限检查,允许Administrator用户操作Super Users组
漏洞复现步骤
-
准备环境:
- 安装受影响版本的Joomla(2.5.0 - 3.9.16)
- 创建Administrator权限的测试账户
-
利用过程:
- 登录Administrator账户
- 发送修改Public组parent_id的请求:
POST /administrator/index.php?option=com_users&task=group.save HTTP/1.1 ... jform[parent_id]=100&jform[id]=1&jform[title]=Public - 发送提升自己权限的请求:
POST /administrator/index.php?option=com_users&task=user.save HTTP/1.1 ... jform[groups][]=8
-
验证结果:
- 检查用户组是否已包含Super Users
- 尝试访问全局设置页面验证权限
技术细节深入
用户组数据结构
Joomla使用改进的前序遍历树(MPTT)存储用户组关系:
- lft和rgt字段:
- 如果rgt - lft = 1,表示叶子节点
- 如果rgt - lft > 1,表示有子节点
- 其他节点的左右值在当前节点左右值之间的都是其子节点
关键代码分析
-
权限检查代码 (
libraries\src\User\User.php):if (!$this->authorise('core.admin', $groupid)) { $this->setError('User not Super Administrator'); return false; } -
getGroupPath方法:
public function getGroupPath($groupid) { $paths = array(); foreach ($this->groups as $group) { if ($group->id == $groupid) { $paths = $group->path; break; } } return $paths; } -
Rule.php中的allow方法:
public function allow($action, $asset = null) { // Check we have a valid asset and action if (empty($action)) { return true; } // Check if the action exists in the data array if (isset($this->data[$action])) { return (bool) $this->data[$action]; } return true; }
漏洞利用工具
GitHub上已有公开的漏洞利用工具:
https://github.com/HoangKien1020/CVE-2020-11890
修复方案
-
官方补丁:
- 升级到Joomla 3.9.17或更高版本
- 补丁修复了用户组权限检查逻辑
-
临时缓解措施:
- 限制管理员账户数量
- 监控用户组修改操作
- 定期审计超级管理员账户
漏洞价值评估
虽然该漏洞被评为低危,但仍有以下价值:
- 权限提升:从Administrator到Super Users的完整权限提升
- 持久性:攻击者可创建新的超级管理员账户保持访问
- 隐蔽性:操作在后台进行,不易被发现
总结
CVE-2020-11890展示了权限系统设计中的常见问题:
- 前端验证不等于后端验证
- 数据结构异常处理不足
- 权限检查逻辑缺陷
尽管实际危害有限,但分析过程揭示了Joomla权限系统的内部工作机制,对理解CMS安全设计有重要参考价值。