Sploitus

Exploit for CVE-2021-43408

kitploit · 2026-09-11

Exploit Code

MARKDOWN77 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-TUANNQ2299-CVE-2021-43408
# CVE-2021-43408: WordPress 插件 Duplicate Post 版本 1.1.9 - SQL 注入

## I. 概述

### 1\. 什么是 WordPress

WordPress 是一款开源的 CMS(内容管理系统)软件,是一个内容管理系统。与使用 HTML 编码语言不同,WP 采用 PHP 编程语言编写,并使用 MySQL 数据库平台。WordPress 由程序员 Matt Mullenweg 和 Mike Little 创立。目前 WordPress 归 Automattic 公司所有,该公司总部位于美国加利福尼亚州旧金山。

### 2\. CVE-2021-43408

WordPress 的 `Duplicate Post` 插件在 1.1.9 及更早版本中存在 SQL 注入漏洞。此类利用方式允许攻击者注入 SQL 查询语句,从而可以读取、修改甚至删除数据库中的资源。 该漏洞可被任何有权使用 `Duplicate Post` 插件功能的认证用户利用。默认情况下,只有管理员拥有此权限,但权限可以修改,因此编辑、作者、投稿者甚至订阅者也可能使用该插件。 CVE-2021-43408 发现于 2021 年 11 月 19 日,根据 CVSS 评分被评估为 `HIGH` 级别。 ![](https://assets.kitploit.com/production/public/readmes/33725/c411b2918b4e860336b4d2f3cf0fb00508b454d17c93f91dd09fc3ec6a52b826.png)

## II. 详细分析

该漏洞的根本原因是用户请求发送的数据在执行 SQL 之前未被清理。 具体而言,在文件 `post/handler.php` 的 `cdn_insert_post()` 函数中:

root@kitploit:~
    
    
     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` 函数,该函数会对数据字符串中的任何引号 `'` 进行转义。 ![](https://assets.kitploit.com/production/public/readmes/33725/bb136ebaf736de5ea9eb88f3973b2ec22d460f10f792346ced26164950b5beff.png)

> 各个数据字段经过 `sanitize_text_field` 处理

然而,代码存在一个漏洞:当将 Integer 类型字段的数据(如 id 字段)传递给 SQL 执行语句时,攻击者可以利用这一点,在该字段值中插入额外的 SQL 语句。因此,要控制 SQL 查询,攻击者只需避免使用 `'` 字符即可。

## III. 演示

### 1\. 环境

  * 操作系统:Windows
  * Xampp:7.1.33
  * WordPress:5.0
  * 插件 Duplicate Post:1.1.9



### 2\. PoC

**步骤 1:** 以管理员用户身份登录,安装 `Duplicate Post` 插件版本 1.1.9。该插件帮助用户复制现有文章。 ![](https://assets.kitploit.com/production/public/readmes/33725/453b0d2d16fe144c802df094e0b795122515bd0fde19275a905fdd3dc21645e5.png)

**步骤 2:** 访问 `文章` 菜单,选择一篇文章,选择操作 `复制` 并点击 `应用`。 ![](https://assets.kitploit.com/production/public/readmes/33725/d8fa5e0384bab95005efb5eef86759f78562277b78c229c015011049c10d828a.png)

**步骤 3:** 选择 `设置:默认` 并点击 `复制`。 ![](https://assets.kitploit.com/production/public/readmes/33725/56f2d6651b937c2273149c9f829d10b3dca430c4374234e49b61111ccfde5159.png)

**步骤 4:** 拦截 HTTP 请求,此处需要注意的数据字段是 `id`,可以看到该字段的数据是整数类型。 ![](https://assets.kitploit.com/production/public/readmes/33725/4b9c4d583bdcba3665bcef4a3b23beed9ed3084f0434520b15eb385154fd12ba.png)

**步骤 5:** 注入 SQL 注入 payload,发送请求,发现 9 秒后服务器才返回响应 -> SQL 注入成功。 Payload:`1 and (select*from(select(sleep(9)))a)-- ` ![](https://assets.kitploit.com/production/public/readmes/33725/554cf65dfcdce3a69b742436b18f569e6a82e1fa9654629fec57a67c158aeeb8.png)

### 3\. 漏洞利用代码

![](https://assets.kitploit.com/production/public/readmes/33725/d836e12ffc2726b6d07fd8b4a89953bd29d7bfceeeb2d05c4250c5231ddde670.png)

## IV. 修复措施

  * 将插件更新到 1.2.0 或更高版本



## V. 参考

  * https://appcheck-ng.com/security-advisory-duplicate-post-wordpress-plugin-sql-injection-vulnerability