禅道项目管理系统身份认证绕过分析(QVD-2024-15263)
字数 1435 2025-08-19 12:42:00
禅道项目管理系统身份认证绕过漏洞分析(QVD-2024-15263) 教学文档
漏洞概述
禅道项目管理系统存在一个严重的身份认证绕过漏洞,远程攻击者可以利用该漏洞绕过系统认证机制,调用任意API接口并修改管理员用户密码,最终实现系统完全控制。
影响版本
- 开源版:16.x <= 禅道项目管理系统 < 18.12
- 企业版:6.x <= 禅道项目管理系统 < 8.12
- 旗舰版:3.x <= 禅道项目管理系统 < 4.12
漏洞复现步骤
-
获取认证Cookie:
GET /api.php?m=testcase&f=savexmindimport&HTTP_X_REQUESTED_WITH=XMLHttpRequest此请求会返回一个有效的会话Cookie
-
验证漏洞存在:
使用获取的Cookie访问用户API接口:GET /api.php/v1/users响应为
error: no company-browse priv.表示漏洞存在,Unauthorized则表示系统已修复
漏洞详细分析
认证流程分析
-
应用初始化:
- 程序首先创建app实例:
$app = router::createApp('pms', dirname(dirname(__FILE__)), 'api'); - 调用
router.class.php#startSession()生成sessionID
- 程序首先创建app实例:
-
权限验证:
- 执行
$common->checkEntry()进行权限验证 isOpenMethod()检查白名单,testcase.savexmindimport在白名单内,跳过后续验证
- 执行
-
AJAX请求验证:
Helper::isAjaxRequest()通过检查HTTP_X_REQUESTED_WITH是否为XMLHttpRequest- 可通过GET参数伪造AJAX请求
认证绕过机制
-
漏洞触发点:
testcase\control.php#saveXmindImport()调用common\model.php#deny()deny()方法在$this->app中添加user字段并存入session
-
认证绕过原理:
- 正常认证检查
$this->app->user是否存在且account不等于guest - 通过漏洞创建的session包含
user字段,绕过认证检查
- 正常认证检查
-
修复后验证:
- 修复版本使用
$this->loadModel('user')->isLogon() isLogon()检查$this->session->user,未登录时为null
- 修复版本使用
漏洞利用扩展
除testcase.savexmindimport外,其他调用deny()的方法也可实现认证绕过,例如:
testcase.getxmindimport
防御措施
-
升级到最新版本:
- 开源版 >= 18.12
- 企业版 >= 8.12
- 旗舰版 >= 4.12
-
临时缓解方案:
- 禁用或限制
testcase.savexmindimport等白名单方法的访问 - 加强API接口的权限验证
- 禁用或限制
技术要点总结
-
关键漏洞点:
- 白名单方法未正确验证会话状态
deny()方法错误设置用户会话
-
利用条件:
- 能够访问系统API接口
- 存在调用
deny()的白名单方法
-
影响范围:
- 可调用任意API接口
- 可修改管理员密码
- 可配合其他漏洞实现服务器完全控制
参考链接
- 官方修复提交:https://github.com/easysoft/zentaopms/commit/d13ba70016ca981b08f27e08fb934bf1f23a4135