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系统中存在两种高级权限:

  1. 超级管理员(Super Users)

    • 拥有Joomla的所有权限
    • 只能由另一个超级管理员创建
    • 可以修改Joomla的全局设置
    • 可以安装/修改模板和语言文件
    • 可以将其他用户提升为超级管理员
  2. 高级管理员(Administrator)

    • 不能将用户升级为超级用户
    • 不能编辑超级用户
    • 不能修改Joomla的全局设置
    • 不能改变和安装模板和语言文件

漏洞原理分析

Joomla用户组树形结构

Joomla使用树形结构管理用户组权限,主要特点:

  1. Public是根节点,ID为1,parent_id为0
  2. RegisteredManagerSuper UsersGuest是第二层节点
  3. 其他用户组(如Administrator)位于更深层次

权限检查机制

当用户尝试修改其他用户的组别时,系统会:

  1. 通过getGroupPath()方法获取目标用户组的祖先路径(path)
  2. Rule.phpallow()方法中检查当前用户是否有权限操作这些组
  3. 对于Administrator用户,$this->data数组包含array(8 => 1),表示禁止操作Super Users组(ID为8)

漏洞触发点

漏洞利用的关键在于:

  1. 修改Public节点的parent_id为一个不存在的值(如100)
  2. 这导致getGroupPath()计算路径时出错,所有节点的path变为null
  3. 权限检查时由于path为null,无法正确比对禁止操作的组别
  4. 从而绕过权限检查,允许Administrator用户操作Super Users组

漏洞复现步骤

  1. 准备环境

    • 安装受影响版本的Joomla(2.5.0 - 3.9.16)
    • 创建Administrator权限的测试账户
  2. 利用过程

    • 登录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
      
  3. 验证结果

    • 检查用户组是否已包含Super Users
    • 尝试访问全局设置页面验证权限

技术细节深入

用户组数据结构

Joomla使用改进的前序遍历树(MPTT)存储用户组关系:

  • lftrgt字段:
    • 如果rgt - lft = 1,表示叶子节点
    • 如果rgt - lft > 1,表示有子节点
    • 其他节点的左右值在当前节点左右值之间的都是其子节点

关键代码分析

  1. 权限检查代码 (libraries\src\User\User.php):

    if (!$this->authorise('core.admin', $groupid)) {
        $this->setError('User not Super Administrator');
        return false;
    }
    
  2. getGroupPath方法

    public function getGroupPath($groupid)
    {
        $paths = array();
        foreach ($this->groups as $group) {
            if ($group->id == $groupid) {
                $paths = $group->path;
                break;
            }
        }
        return $paths;
    }
    
  3. 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

修复方案

  1. 官方补丁

    • 升级到Joomla 3.9.17或更高版本
    • 补丁修复了用户组权限检查逻辑
  2. 临时缓解措施

    • 限制管理员账户数量
    • 监控用户组修改操作
    • 定期审计超级管理员账户

漏洞价值评估

虽然该漏洞被评为低危,但仍有以下价值:

  1. 权限提升:从Administrator到Super Users的完整权限提升
  2. 持久性:攻击者可创建新的超级管理员账户保持访问
  3. 隐蔽性:操作在后台进行,不易被发现

总结

CVE-2020-11890展示了权限系统设计中的常见问题:

  • 前端验证不等于后端验证
  • 数据结构异常处理不足
  • 权限检查逻辑缺陷

尽管实际危害有限,但分析过程揭示了Joomla权限系统的内部工作机制,对理解CMS安全设计有重要参考价值。

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的请求: 发送提升自己权限的请求: 验证结果 : 检查用户组是否已包含Super Users 尝试访问全局设置页面验证权限 技术细节深入 用户组数据结构 Joomla使用改进的前序遍历树(MPTT)存储用户组关系: lft 和 rgt 字段: 如果rgt - lft = 1,表示叶子节点 如果rgt - lft > 1,表示有子节点 其他节点的左右值在当前节点左右值之间的都是其子节点 关键代码分析 权限检查代码 ( libraries\src\User\User.php ): getGroupPath方法 : Rule.php中的allow方法 : 漏洞利用工具 GitHub上已有公开的漏洞利用工具: https://github.com/HoangKien1020/CVE-2020-11890 修复方案 官方补丁 : 升级到Joomla 3.9.17或更高版本 补丁修复了用户组权限检查逻辑 临时缓解措施 : 限制管理员账户数量 监控用户组修改操作 定期审计超级管理员账户 漏洞价值评估 虽然该漏洞被评为低危,但仍有以下价值: 权限提升 :从Administrator到Super Users的完整权限提升 持久性 :攻击者可创建新的超级管理员账户保持访问 隐蔽性 :操作在后台进行,不易被发现 总结 CVE-2020-11890展示了权限系统设计中的常见问题: 前端验证不等于后端验证 数据结构异常处理不足 权限检查逻辑缺陷 尽管实际危害有限,但分析过程揭示了Joomla权限系统的内部工作机制,对理解CMS安全设计有重要参考价值。