CVE-2025-67877ChurchCRM是一款开源的教会管理系统,广泛应用于全球各类宗教组织,用于管理信徒信息、捐赠记录、活动安排等核心业务数据。该系统基于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注入的可能性。