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. 关键字符串替换问题

漏洞核心在于writeread方法中的字符串替换操作:

// 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. 会话验证流程

  1. JSession::checkToken()验证会话令牌
  2. 新建会话时isNew()返回true
  3. 触发重定向逻辑
  4. 通过register_shutdown_function('session_write_close')在PHP结束时写入会话

3. 构造恶意会话数据

利用字符串替换差异构造恶意序列化数据:

__default|a:8:{s:15:"session.counter";i:5;...}

关键点在于控制usernamepassword字段的长度,使后续数据被解析为序列化对象。

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. 完整利用链

  1. 控制disconnectHandlers数组
  2. 通过SimplePie类的cache_name_functionfeed_url属性
  3. 实现任意函数调用

漏洞复现

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:"*";}

修复建议

  1. 升级到Joomla 3.4.7或更高版本
  2. 修改会话处理逻辑,确保序列化字符串长度计算准确
  3. 对会话数据进行严格验证

总结

该漏洞利用Joomla会话处理机制中的字符串替换缺陷,通过精心构造的序列化数据实现远程代码执行。关键在于:

  1. 利用\0\0\0chr(0).'*'.chr(0)的长度差异
  2. 控制反序列化过程构造恶意对象
  3. 通过POP链最终实现任意代码执行

理解此漏洞需要对PHP序列化机制、Joomla架构和对象注入技术有深入认识。

Joomla 3.0-3.4.6 远程代码执行漏洞分析报告 漏洞概述 本报告详细分析了Joomla CMS 3.0至3.4.6版本中存在的一个远程代码执行(RCE)漏洞。该漏洞源于Joomla会话处理机制中的字符串替换操作不当,导致反序列化过程中可构造恶意对象实现代码执行。 漏洞原理 1. 会话存储机制 Joomla将会话数据存储在数据库中,关键处理逻辑位于 /libraries/joomla/session/storage.php : 2. 关键字符串替换问题 漏洞核心在于 write 和 read 方法中的字符串替换操作: 这种替换导致序列化字符串长度计算错误: chr(0).'*'.chr(0) → 3字节 \0\0\0 → 6字节 漏洞利用路径 1. 触发点 通过 /index.php/component/users 路由访问,提交以下参数: 2. 会话验证流程 JSession::checkToken() 验证会话令牌 新建会话时 isNew() 返回true 触发重定向逻辑 通过 register_shutdown_function('session_write_close') 在PHP结束时写入会话 3. 构造恶意会话数据 利用字符串替换差异构造恶意序列化数据: 关键点在于控制 username 和 password 字段的长度,使后续数据被解析为序列化对象。 POP链分析 1. 反序列化入口 通过 JDatabaseDriverMysqli 类的 __destruct 方法: 2. 关键调用链 3. 完整利用链 控制 disconnectHandlers 数组 通过 SimplePie 类的 cache_name_function 和 feed_url 属性 实现任意函数调用 漏洞复现 1. 构造PoC 2. 长度欺骗示例 修复建议 升级到Joomla 3.4.7或更高版本 修改会话处理逻辑,确保序列化字符串长度计算准确 对会话数据进行严格验证 总结 该漏洞利用Joomla会话处理机制中的字符串替换缺陷,通过精心构造的序列化数据实现远程代码执行。关键在于: 利用 \0\0\0 与 chr(0).'*'.chr(0) 的长度差异 控制反序列化过程构造恶意对象 通过POP链最终实现任意代码执行 理解此漏洞需要对PHP序列化机制、Joomla架构和对象注入技术有深入认识。