CVE-2022-21663 wordpress <5.8.3 对象注入漏洞
字数 1602 2025-08-07 08:22:29
WordPress 对象注入漏洞分析 (CVE-2022-21663)
漏洞概述
CVE-2022-21663 是 WordPress 中的一个对象注入漏洞,允许具有管理员权限的用户通过修改特定选项实现反序列化攻击,可能导致远程代码执行。
影响范围
- WordPress 版本 < 5.8.3
- 必须启用多站点模式
- 需要存在可用的反序列化利用链
漏洞背景
该漏洞与 WordPress 的升级机制和选项处理方式有关,特别是在多站点模式下处理数据库升级时存在反序列化操作。
漏洞分析
漏洞入口点
漏洞主要入口位于 wp-admin/upgrade.php 文件,管理员可以直接访问该文件。
关键函数调用链
wp_upgrade()函数 (位于wp-admin/includes/upgrade.php)upgrade_all()函数upgrade_280()函数
漏洞触发条件
- 数据库版本 (
$wp_current_db_version) 与当前版本 ($wp_db_version) 不一致 - 系统启用了多站点模式 (
is_multisite()返回 true)
漏洞核心
在 upgrade_280() 函数中,存在以下关键代码:
$options = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options LIMIT 20");
foreach ($options as $option) {
$value = maybe_unserialize($option->option_value);
// 处理选项...
}
这段代码从 wp_options 表中获取20条记录,并对每条记录的 option_value 进行反序列化操作。
利用方法
步骤1:修改数据库版本
- 访问
wp-admin/options.php - 找到
db_version选项 - 将其值修改为10300(或其他低于当前版本的数值)
步骤2:注入恶意序列化数据
-
选择一个合适的选项进行修改(推荐使用"密码"选项或
mailserver_pass)- 选择标准:
sanitize_option()函数对该选项的处理较少 - 避免选择会进行严格过滤的选项(如
blogdescription)
- 选择标准:
-
构造特殊的反序列化字符串:
- 使用
C类型代替通常的O类型(自定义对象类型) - 示例:
C:23:"Requests_Transport_cURL":0:{}
- 使用
绕过二次序列化检查
WordPress 的 maybe_serialize() 函数会检查输入是否是序列化数据,但遗漏了对 C 类型的检查:
function is_serialized($data) {
// 检查第一个字符
if (!is_string($data)) {
return false;
}
$data = trim($data);
if ('N;' == $data) {
return true;
}
if (strlen($data) < 4) {
return false;
}
if (':' !== $data[1]) {
return false;
}
$s = $data[0];
$e = substr($data, -1);
if ('s' === $e && '"' === substr($data, -2, 1)) {
$e = '"';
}
if ($s !== $e) {
return false;
}
switch ($s) {
case 'b':
case 'i':
case 'd':
case 's':
case 'a':
case 'O':
return true;
}
return false;
}
注意这里没有检查 C 类型,因此可以绕过二次序列化检查。
漏洞复现
-
构造恶意序列化字符串(示例使用
Requests_Transport_cURL类):C:23:"Requests_Transport_cURL":0:{} -
将上述字符串写入到选择的选项值中
-
修改
db_version为10300 -
访问
upgrade.php或直接修改选项触发反序列化 -
观察
__destruct方法是否被触发
修复方案
WordPress 在5.8.3版本中修复了该漏洞,修复提交记录:
https://github.com/WordPress/WordPress/commit/66bb979049fa1a515d031e53ab100d507ed7bc8b
主要修复措施:
- 加强了对序列化数据的检查
- 移除了不必要的反序列化操作
总结
该漏洞需要管理员权限才能利用,但结合其他漏洞或社会工程学攻击可能造成严重危害。关键在于:
- 利用
C类型绕过序列化检查 - 选择合适的选项存储恶意序列化数据
- 通过修改数据库版本触发反序列化操作
参考链接
- 官方修复记录:https://github.com/WordPress/WordPress/commit/66bb979049fa1a515d031e53ab100d507ed7bc8b
- SonarSource 分析文章:https://blog.sonarsource.com/wordpress-object-injection-vulnerability