Joomla 3.0-3.4.6 rce分析
字数 1011 2025-08-26 22:11:22
Joomla 3.0-3.4.6 远程代码执行漏洞分析报告
漏洞概述
本报告详细分析了Joomla CMS 3.0至3.4.6版本中存在的一个远程代码执行(RCE)漏洞。该漏洞源于Joomla会话处理机制中的字符串替换操作不当,导致反序列化过程中可构造恶意对象实现代码执行。
漏洞原理
1. 会话存储机制
Joomla将会话数据存储在数据库中,关键处理逻辑位于/libraries/joomla/session/storage.php:
public function register() {
session_set_save_handler(
array($this, 'open'),
array($this, 'close'),
array($this, 'read'),
array($this, 'write'),
array($this, 'destroy'),
array($this, 'gc')
);
}
2. 关键字符串替换问题
漏洞核心在于write和read方法中的字符串替换操作:
// write方法中的替换
$data = str_replace(chr(0) . '*' . chr(0), '\0\0\0', $data);
// read方法中的反向替换
$result = str_replace('\0\0\0', chr(0) . '*' . chr(0), $result);
这种替换导致序列化字符串长度计算错误:
chr(0).'*'.chr(0)→ 3字节\0\0\0→ 6字节
漏洞利用路径
1. 触发点
通过/index.php/component/users路由访问,提交以下参数:
POST /index.php/component/users
task=user.login
2. 会话验证流程
JSession::checkToken()验证会话令牌- 新建会话时
isNew()返回true - 触发重定向逻辑
- 通过
register_shutdown_function('session_write_close')在PHP结束时写入会话
3. 构造恶意会话数据
利用字符串替换差异构造恶意序列化数据:
__default|a:8:{s:15:"session.counter";i:5;...}
关键点在于控制username和password字段的长度,使后续数据被解析为序列化对象。
POP链分析
1. 反序列化入口
通过JDatabaseDriverMysqli类的__destruct方法:
public function __destruct() {
$this->disconnect();
}
2. 关键调用链
// JDatabaseDriverMysqli::disconnect()
foreach ($this->disconnectHandlers as $h) {
call_user_func_array($h, array(&$this));
}
// 最终触发SimplePie中的危险调用
call_user_func(array($this->cache_class, 'create'),
$this->cache_location,
call_user_func($this->cache_name_function, $this->feed_url),
'spc');
3. 完整利用链
- 控制
disconnectHandlers数组 - 通过
SimplePie类的cache_name_function和feed_url属性 - 实现任意函数调用
漏洞复现
1. 构造PoC
class a {
public $a;
function __construct() {
$this->a = chr(0) . '*' . chr(0);
}
}
echo serialize(new a());
// 输出: O:1:"a":1:{s:1:"a";s:3:"*";}
2. 长度欺骗示例
class a {
public $a;
function __construct() {
$this->a = '\0\0\0';
}
}
echo str_replace('\0\0\0', chr(0).'*'.chr(0), serialize(new a()));
// 输出: O:1:"a":1:{s:1:"a";s:6:"*";}
修复建议
- 升级到Joomla 3.4.7或更高版本
- 修改会话处理逻辑,确保序列化字符串长度计算准确
- 对会话数据进行严格验证
总结
该漏洞利用Joomla会话处理机制中的字符串替换缺陷,通过精心构造的序列化数据实现远程代码执行。关键在于:
- 利用
\0\0\0与chr(0).'*'.chr(0)的长度差异 - 控制反序列化过程构造恶意对象
- 通过POP链最终实现任意代码执行
理解此漏洞需要对PHP序列化机制、Joomla架构和对象注入技术有深入认识。