WordPress 是一款开源的 CMS(内容管理系统)软件,是一个内容管理系统。与使用 HTML 编码语言不同,WP 采用 PHP 编程语言编写,并使用 MySQL 数据库平台。WordPress 由程序员 Matt Mullenweg 和 Mike Little 创立。目前 WordPress 归 Automattic 公司所有,该公司总部位于美国加利福尼亚州旧金山。
WordPress 的 Duplicate Post 插件在 1.1.9 及更早版本中存在 SQL 注入漏洞。此类利用方式允许攻击者注入 SQL 查询语句,从而可以读取、修改甚至删除数据库中的资源。
该漏洞可被任何有权使用 Duplicate Post 插件功能的认证用户利用。默认情况下,只有管理员拥有此权限,但权限可以修改,因此编辑、作者、投稿者甚至订阅者也可能使用该插件。
CVE-2021-43408 发现于 2021 年 11 月 19 日,根据 CVSS 评分被评估为 HIGH 级别。

该漏洞的根本原因是用户请求发送的数据在执行 SQL 之前未被清理。
具体而言,在文件 post/handler.php 的 cdn_insert_post() 函数中:
function cdp_insert_post($id, $data, $times, $areWePro, $isChild = false, $p_ids = null, $site) {
// 获取 WordPress 数据库
global $wpdb;
// 为新 ID 和错误创建空数组
$results = array('ids' => array(), 'error' => 0, 'counter' => 0);
// 获取计数器值
$prefix = (($site != -1) ? $wpdb->get_blog_prefix($site) : $wpdb->get_blog_prefix());
$newestId = $wpdb->get_results("SELECT post_id FROM {$prefix}postmeta WHERE meta_key = '_cdp_origin' AND meta_value = {$id} ORDER BY post_id DESC LIMIT 1", ARRAY_A);
$id受攻击者控制
变量 $id 被传入包含 SQL 查询语句的函数,且未经过任何清理。此函数通过 WordPress Ajax wp_ajax_cdp_action_handling 调用。
可以看出参数 id 经过 cdn_sanitize_array 函数处理,在此函数中,post 的各个数据字段会通过 sanitize_text_field 函数,该函数会对数据字符串中的任何引号 ' 进行转义。

各个数据字段经过
sanitize_text_field处理
然而,代码存在一个漏洞:当将 Integer 类型字段的数据(如 id 字段)传递给 SQL 执行语句时,攻击者可以利用这一点,在该字段值中插入额外的 SQL 语句。因此,要控制 SQL 查询,攻击者只需避免使用 ' 字符即可。
步骤 1: 以管理员用户身份登录,安装 Duplicate Post 插件版本 1.1.9。该插件帮助用户复制现有文章。

步骤 2: 访问 文章 菜单,选择一篇文章,选择操作 复制 并点击 应用。

步骤 3: 选择 设置:默认 并点击 复制。

步骤 4: 拦截 HTTP 请求,此处需要注意的数据字段是 id,可以看到该字段的数据是整数类型。

步骤 5: 注入 SQL 注入 payload,发送请求,发现 9 秒后服务器才返回响应 -> SQL 注入成功。
Payload:1 and (select*from(select(sleep(9)))a)--

