## 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` 级别。 
## 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` 函数,该函数会对数据字符串中的任何引号 `'` 进行转义。 
> 各个数据字段经过 `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。该插件帮助用户复制现有文章。 
**步骤 2:** 访问 `文章` 菜单,选择一篇文章,选择操作 `复制` 并点击 `应用`。 
**步骤 3:** 选择 `设置:默认` 并点击 `复制`。 
**步骤 4:** 拦截 HTTP 请求,此处需要注意的数据字段是 `id`,可以看到该字段的数据是整数类型。 
**步骤 5:** 注入 SQL 注入 payload,发送请求,发现 9 秒后服务器才返回响应 -> SQL 注入成功。 Payload:`1 and (select*from(select(sleep(9)))a)-- ` 
### 3\. 漏洞利用代码

## IV. 修复措施
* 将插件更新到 1.2.0 或更高版本
## V. 参考
* https://appcheck-ng.com/security-advisory-duplicate-post-wordpress-plugin-sql-injection-vulnerability