Joomla 3.4.6 RCE 分析
字数 1400 2025-08-26 22:11:22

Joomla 3.4.6 远程代码执行漏洞分析与利用

漏洞概述

  • 影响版本: Joomla 3.0.0 至 3.4.6
  • PHP版本限制: 不支持PHP 7.0 (Joomla 3.4及之前版本)
  • 漏洞类型: Session反序列化导致的远程代码执行
  • 漏洞成因: 对session处理不当,可伪造session导致反序列化漏洞

漏洞分析

Session处理机制问题

Joomla的session处理存在以下关键问题:

  1. Session存储方式:未经验证的用户名和密码存储在_session表中
  2. 登录流程:登录过程中存在303跳转,先执行write函数再执行read函数
  3. 特殊字符替换
    • 写入时将\x00*\x00替换为\0\0\0(MySQL不能存储NULL)
    • 读取时将\0\0\0替换回\x00*\x00

替换机制导致的溢出漏洞

关键替换行为:

  • 3字节的\0\0\0被替换为6字节的\x00*\x00
  • 当提交的用户名为per\0\0\0i0d时:
    • 读取后变为s:8:s:"username";s:12:"perNNNi0d"(N代表NULL)
    • 声明长度为12字节但实际只有9字节,导致无效对象

利用原理

  1. Session逃逸

    • 使用\0\0\0溢出逃逸密码value
    • 重新构建有效对象
    • 密码字段内容逃逸出来直接进行反序列化
  2. EXP构造示例

    • 数据库存储:s:8:s:"username";s:54:"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";s:8:"password";s:6:"123456"
    • 读取替换后:s:8:s:"username";s:54:"NNNNNNNNNNNNNNNNNNNNNNNNNNN";s:8:"password";s:6:"123456"
    • 实现对象注入:s:8:s:"username";s:54:"NNNNNNNNNNNNNNNNNNNNNNNNNNN";s:8:"password";s:6:"1234";s:2:"HS":O:15:"ObjectInjection"

POP链构造

第一段利用链

位于libraries/joomla/database/driver/mysqli.php

public function __destruct() {
    $this->disconnect();
}

public function disconnect() {
    if ($this->connection) {
        foreach ($this->disconnectHandlers as $h) {
            call_user_func_array($h, array(&$this));
        }
        mysqli_close($this->connection);
    }
    $this->connection = null;
}
  • 触发条件:$this->connection为true
  • 利用方式:通过disconnectHandlers数组执行任意函数

第二段利用链

位于libraries/simplepie/simplepie.php

  • 触发条件:
    • $this->cache必须为true
    • $parsed_feed_url['scheme']不为空
  • 优势:函数和参数值都可控

漏洞验证

成功利用后,返回页面中会出现字符串zopatkgieeqqmifstiih作为判断依据。

漏洞修复方案

  1. 对session信息进行base64或其他编码处理
  2. 升级到修复版本

参考资源

  1. Hacktive Security博客分析
  2. 漏洞利用PoC代码

总结

该漏洞利用Joomla对session处理的缺陷,通过精心构造的序列化数据实现对象注入,最终导致远程代码执行。理解此漏洞需要对PHP序列化机制、Joomla框架的session处理流程以及POP链构造有深入认识。

Joomla 3.4.6 远程代码执行漏洞分析与利用 漏洞概述 影响版本 : Joomla 3.0.0 至 3.4.6 PHP版本限制 : 不支持PHP 7.0 (Joomla 3.4及之前版本) 漏洞类型 : Session反序列化导致的远程代码执行 漏洞成因 : 对session处理不当,可伪造session导致反序列化漏洞 漏洞分析 Session处理机制问题 Joomla的session处理存在以下关键问题: Session存储方式 :未经验证的用户名和密码存储在 _session 表中 登录流程 :登录过程中存在303跳转,先执行write函数再执行read函数 特殊字符替换 : 写入时将 \x00*\x00 替换为 \0\0\0 (MySQL不能存储NULL) 读取时将 \0\0\0 替换回 \x00*\x00 替换机制导致的溢出漏洞 关键替换行为: 3字节的 \0\0\0 被替换为6字节的 \x00*\x00 当提交的用户名为 per\0\0\0i0d 时: 读取后变为 s:8:s:"username";s:12:"perNNNi0d" (N代表NULL) 声明长度为12字节但实际只有9字节,导致无效对象 利用原理 Session逃逸 : 使用 \0\0\0 溢出逃逸密码value 重新构建有效对象 密码字段内容逃逸出来直接进行反序列化 EXP构造示例 : 数据库存储: s:8:s:"username";s:54:"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";s:8:"password";s:6:"123456" 读取替换后: s:8:s:"username";s:54:"NNNNNNNNNNNNNNNNNNNNNNNNNNN";s:8:"password";s:6:"123456" 实现对象注入: s:8:s:"username";s:54:"NNNNNNNNNNNNNNNNNNNNNNNNNNN";s:8:"password";s:6:"1234";s:2:"HS":O:15:"ObjectInjection" POP链构造 第一段利用链 位于 libraries/joomla/database/driver/mysqli.php : 触发条件: $this->connection 为true 利用方式:通过 disconnectHandlers 数组执行任意函数 第二段利用链 位于 libraries/simplepie/simplepie.php : 触发条件: $this->cache 必须为true $parsed_feed_url['scheme'] 不为空 优势:函数和参数值都可控 漏洞验证 成功利用后,返回页面中会出现字符串 zopatkgieeqqmifstiih 作为判断依据。 漏洞修复方案 对session信息进行base64或其他编码处理 升级到修复版本 参考资源 Hacktive Security博客分析 漏洞利用PoC代码 总结 该漏洞利用Joomla对session处理的缺陷,通过精心构造的序列化数据实现对象注入,最终导致远程代码执行。理解此漏洞需要对PHP序列化机制、Joomla框架的session处理流程以及POP链构造有深入认识。