前言:
WordPress的Country State City Dropdown CF 7插件是一款用于WordPress网站的插件,它可以与Contact Form 7(CF 7)表单插件配合使用,为用户提供了一个方便的方式来在表单中选择国家、州/省和城市。近期WordPress Country State City Dropdown CF7插件被爆出在版本2.7.2及之前的版本中存在SQL注入漏洞(CVE-2024-3495),本篇文章围绕该漏洞展开学习。
0x01 漏洞描述:
WordPress Country State City Dropdown CF7插件在版本2.7.2及之前的版本中存在SQL注入漏洞(CVE-2024-3495)未经身份验证的远程攻击者可利用此漏洞获取数据库敏感信息。该漏洞是因为用户提供的参数未经足够转义并且现有SQL查询未经充分准备。这使得未经身份验证的攻击者可以将额外的SQL查询附加到已存在的查询中,从而提取数据库中的敏感信息。
影响版本:Country State City Dropdown CF7<=2.7.2
0x02 环境搭建:
Country State City Dropdown CF7插件下载地址
下载插件后直接上传至wordpress中即可。
0x03 漏洞分析:
一、nonce:
首先了解一下wordpress中nonce的作用是什么?nonce字面意思一般指的是“使用一次的数字”,而在wordpress中nonce主要用于通过将查询字符串嵌入到URL 和表单来工作,确保请求有效并且来自合法用户。细节请看此篇文章
image-20240614151548616
在wordpress中nonce的生成:
通过调用wp_create_nonce函数生成nonce值,首先根据传入的$action判断action是否有效,下来根据当前用户登录状态返回uid,如果是登录状态则传回登录uid,如果没有登陆uid赋值为0通过’nonce_user_logged_out’ 过滤器来修改uid,再使用wp_hash() 函数生成nonce值。nonce值与当前用户uid和session绑定。(在WordPress中切换当前用户的身份,可以根据用户ID或用户名来指定,意味着无论是否登录,都可以生成nonce)
nonce有效期默认为12h
二、未授权sql注入
根据公开poc定位到问题所在位置wp-content/plugins/country-state-city-auto-dropdown/includes/ajax-actions.php:
这里主函数定义了tc_csca_get_states、tc_csca_get_cities函数,任选一个tc_csca_get_cities函数进行分析。先是使用check_ajax_referer函数对传入的nonce与后端生成的nonce进行校验。下来直接就定义全局变量$wpdb,用于后续sql查询。然后通过一个if语句判断是否设置了名为 sid 的 POST 参数,存在将其值赋给变量 $sid。其中sanitize_text_field() 函数用于清理和过滤输入。最后把经过处理的sid值代入sql查询语句。下面跟进看下这里的逻辑。
跟进check_ajax_referer函数,可以看到此函数用于检验AJAX 请求中的安全性,主要校验传参进来的nonce与后端针对action生成得nonce是否相对应。逻辑如下:首先检查是否传入有效的action,然后从传入的参数中提取nonce值,下来使用 wp_verify_nonce() 函数来验证提取到的 nonce 的有效性,将 nonce 与指定的 $action 进行比较,并返回验证结果。验证完成后,函数触发一个动作钩子 check_ajax_referer,传递 $action 和验证结果 $result,最后如果验证失败且 $stop 参数为 flase函数终止并输出错误信息。