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 文件,管理员可以直接访问该文件。

关键函数调用链

  1. wp_upgrade() 函数 (位于 wp-admin/includes/upgrade.php)
  2. upgrade_all() 函数
  3. upgrade_280() 函数

漏洞触发条件

  1. 数据库版本 ($wp_current_db_version) 与当前版本 ($wp_db_version) 不一致
  2. 系统启用了多站点模式 (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:修改数据库版本

  1. 访问 wp-admin/options.php
  2. 找到 db_version 选项
  3. 将其值修改为10300(或其他低于当前版本的数值)

步骤2:注入恶意序列化数据

  1. 选择一个合适的选项进行修改(推荐使用"密码"选项或 mailserver_pass

    • 选择标准:sanitize_option() 函数对该选项的处理较少
    • 避免选择会进行严格过滤的选项(如 blogdescription
  2. 构造特殊的反序列化字符串:

    • 使用 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 类型,因此可以绕过二次序列化检查。

漏洞复现

  1. 构造恶意序列化字符串(示例使用 Requests_Transport_cURL 类):

    C:23:"Requests_Transport_cURL":0:{}
    
  2. 将上述字符串写入到选择的选项值中

  3. 修改 db_version 为10300

  4. 访问 upgrade.php 或直接修改选项触发反序列化

  5. 观察 __destruct 方法是否被触发

修复方案

WordPress 在5.8.3版本中修复了该漏洞,修复提交记录:
https://github.com/WordPress/WordPress/commit/66bb979049fa1a515d031e53ab100d507ed7bc8b

主要修复措施:

  1. 加强了对序列化数据的检查
  2. 移除了不必要的反序列化操作

总结

该漏洞需要管理员权限才能利用,但结合其他漏洞或社会工程学攻击可能造成严重危害。关键在于:

  1. 利用 C 类型绕过序列化检查
  2. 选择合适的选项存储恶意序列化数据
  3. 通过修改数据库版本触发反序列化操作

参考链接

  1. 官方修复记录:https://github.com/WordPress/WordPress/commit/66bb979049fa1a515d031e53ab100d507ed7bc8b
  2. SonarSource 分析文章:https://blog.sonarsource.com/wordpress-object-injection-vulnerability
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() 函数中,存在以下关键代码: 这段代码从 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 类型的检查: 注意这里没有检查 C 类型,因此可以绕过二次序列化检查。 漏洞复现 构造恶意序列化字符串(示例使用 Requests_Transport_cURL 类): 将上述字符串写入到选择的选项值中 修改 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