欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Joomla 权限提升漏洞(CVE-2016-9838)分析

来源:本站整理 作者:佚名 时间:2016-12-22 TAG: 我要投稿

1.漏洞简介
Joomla 于12月13日发布了3.6.5的升级公告,此次升级修复了三个安全漏洞,其中 CVE-2016-9838 被官方定为高危。根据官方的描述,这是一个权限提升漏洞,利用该漏洞攻击者可以更改已存在用户的用户信息,包括用户名、密码、邮箱和权限组 。经过分析测试,成功实现了水平用户权限突破,但没有实现垂直权限提升为管理员。
2.漏洞影响
触发漏洞前提条件:
网站开启注册功能攻击者知道想要攻击的用户的 id (不是用户名)成功攻击后攻击者可以更改已存在用户的用户信息,包括用户名、密码、邮箱和权限组 。
3.影响版本
1.6.0 - 3.6.4
0x01 漏洞复现
1. 环境搭建
docker-compose.yml:
version: '2'
services: 
  db:
    image: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=hellojm
      - MYSQL_DATABASE=jm
  app:
    image: joomla:3.6.3
    depends_on:
      - db
    links:
      - db
    ports:
      - "127.0.0.1:8080:80"
然后在 docker-compose.yml 所在目录执行docker-compose up,访问后台开启注册再配置SMTP即可。
2.漏洞分析
官方没有给出具体的分析,只给了描述:

翻译过来就是:
对表单验证失败时存储到 session 中的未过滤数据的不正确使用会导致对现有用户帐户的修改,包括重置其用户名,密码和用户组分配。
因为没有具体细节,所以我们先从补丁下手,其中这个文件的更改引起了我的注意:
https://github.com/joomla/joomla-cms/commit/435a2226118a4e83ecaf33431ec05f39c640c744

可以看到这里的$temp是 session 数据,而该文件又与用户相关,所以很有可能就是漏洞点。
我们下面通过这样两个步骤来分析:
寻找输入点梳理处理逻辑1.寻找输入点
我们找一下这个 session 是从哪里来的:

在components/com_users/controllers/registration.php中设置,在components/com_users/models/registration.php中获取。我们看components/com_users/controllers/registration.php中第108-204行的register函数:
public function register() 
{
    ...
    $data = $model->validate($form, $requestData);
    // Check for validation errors.
    if ($data === false)
    {
        ...
        // Save the data in the session.
        $app->setUserState('com_users.registration.data', $requestData);
        ...
    }
    // Attempt to save the data.
    $return = $model->register($data);
    // Check for errors.
    if ($return === false)
    {
        // Save the data in the session.
        $app->setUserState('com_users.registration.data', $data);
        ...    
    }
    ...
}
这两处设置 session 均在产生错误后进行,和漏洞描述相符,并且$requestData是我们原始的请求数据,并没有被过滤,所以基本可以把这里当作我们的输入点。
我们来验证一下,首先随便注册一个用户,然后再注册同样的用户并开启动态调试:

由于这个用户之前注册过,所以验证出错,从而将请求数据写入了 session 中。
取 session 的地方在components/com_users/models/registration.php的getData函数,该函数在访问注册页面时就会被调用一次,我们在这时就可以看到 session 的值:

由于存储的是请求数据,所以我们还可以通过构造请求来向 session 中写入一些额外的变量。
2.梳理处理逻辑
输入点找到了,下面来看我们输入的数据在哪里被用到。我们看components/com_users/models/registration.php的register函数:
public function register($temp) 
{
    $params = JComponentHelper::getParams('com_users');
    // Initialise the table with JUser.
    $user = new JUser;

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载