插件未授权sql注入漏洞分析

前言:
​ 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函数终止并输出错误信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值