CVE-2016-8870(Joomla 提权类漏洞 )

前言

     Joomla是一套全球知名的内容管理系统。Joomla是使用PHP语言加上MySQL数据库所开发的软件系统,可以在Linux、Windows、MacOSX等各种不同的平台上执行。目前是由OpenSourceMatters这个开放源码组织进行开发与支持。 

漏洞编号

CVE-2016-8870

漏洞影响范围

joomal 3.4.4 ~3.6.3

漏洞分析

在存在漏洞的版本中有两个用户注册的方法:

(1)位于components/com_users/controllers/registration.php中的UserControllerRegistration::register()

public function register()
    {
        // Check for request forgeries.
        JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

        // If registration is disabled - Redirect to login page.
        if (JComponentHelper::getParams('com_users')->get('allowUserRegistration') == 0)
        {
            $this->setRedirect(JRoute::_('index.php?option=com_users&view=login', false));

            return false;
        }
        $app   = JFactory::getApplication();
        $model = $this->getModel('Registration', 'UsersModel');

        // Get the user data.
        $requestData = $this->input->post->get('jform', array(), 'array');

        // Validate the posted data.
        $form = $model->getForm();

        .......................................................
    }

(2)位于components/com_users/controllers/user.php中的UsersControllerUser::register()

public function register()
    {
        JSession::checkToken('post') or jexit(JText::_('JINVALID_TOKEN'));

        // Get the application
        $app = JFactory::getApplication();

        // Get the form data.
        $data = $this->input->post->get('user', array(), 'array');

        // Get the model and validate the data.
        $model  = $this->getModel('Registration', 'UsersModel');

        $form = $model->getForm();

        ............................
    }

可以通过对比UserControllerRegistration::register()和UsersControllerUser::register()发现,在

UsersControllerUser::register()缺少以下代码:

// If registration is disabled - Redirect to login page.
if (JComponentHelper::getParams('com_users')->get('allowUserRegistration') == 0)
{
    $this->setRedirect(JRoute::_('index.php?option=com_users&view=login', false));

    return false;
}

这几行代码是检查是否允许注册,也就是说如果我们可以用UsersControllerUser::register()这个方法来进行注册就可以绕过这个检测发送的请求参数task=registration.register能够知道这里默认注册是调用的register.php下UsersControllerRegistration类,但是我们想要调用的是user.php下UsersControllerUser

下面进行一个简单的提权的分析:

在利用注册的时候,我们使用的user.php下UsersControllerUser类的register方法的最后面有这样一句代码

$return = $model->register($data);

这句代码调用了components/com_users/models/registration.php下的register方法,我们可以在这里看一下这个方法:

public function regioter($tomp)
$parama 一JcomponentHolper getParamd ‘com_usero ’)
1Initlalise the table with JUser.
$uaer 一new JUaeri
$data- (array) $thia->getData( )1
"1Nerge in the registration data.
foreach ($temp ag $k -> $v)
$data[sk]- $vI
11Prepare the data for the userobject
$data['emall']- JStringPunycode temailroPunycode $data['emall 1' ]) ,
$data[' pasgword'] 一$datal'passwordl' ]1
$useractivation 一$params->get( ugeractivation )1
$eendpaseword 一$params->get( Bendpassword ,1) 1
11Check 1f the user needs to activate their account.
if (($useractivation -- 1) I1($useractivation - 2) )

 

 

$data参数分析

由下图可以看到其实我们这个$data实际还存在一个参数是groups的数组,而这个数组就决定了账户的权限。

 

这里groups的第一个值决定了账户的权限。默认情况下我们注册时groups的第一个值为2,即Registered。我们要构造数据包的值为7,Administrator。

 

 

漏洞复现

 

(1)打开注册选项:

(2)注册用户

 

抓到注册用户的数据包

 

(3)将网站注册选项关闭,更改数据包进行用户注册,之后再使用Reapter进行发送

(4)用户注册成功,只是普通用户,将这个用户删掉,进行管理员账户的创建

(5)更改数据包,将创建的用户的分组设置为第七个分组,即管理员分组

(6)注册用户成功,提权成功,显示用户等级为Adaministrator

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FLy_鹏程万里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值