禅道项目管理系统身份认证绕过分析(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

漏洞复现步骤

  1. 获取认证Cookie

    GET /api.php?m=testcase&f=savexmindimport&HTTP_X_REQUESTED_WITH=XMLHttpRequest
    

    此请求会返回一个有效的会话Cookie

  2. 验证漏洞存在
    使用获取的Cookie访问用户API接口:

    GET /api.php/v1/users
    

    响应为error: no company-browse priv.表示漏洞存在,Unauthorized则表示系统已修复

漏洞详细分析

认证流程分析

  1. 应用初始化

    • 程序首先创建app实例:$app = router::createApp('pms', dirname(dirname(__FILE__)), 'api');
    • 调用router.class.php#startSession()生成sessionID
  2. 权限验证

    • 执行$common->checkEntry()进行权限验证
    • isOpenMethod()检查白名单,testcase.savexmindimport在白名单内,跳过后续验证
  3. AJAX请求验证

    • Helper::isAjaxRequest()通过检查HTTP_X_REQUESTED_WITH是否为XMLHttpRequest
    • 可通过GET参数伪造AJAX请求

认证绕过机制

  1. 漏洞触发点

    • testcase\control.php#saveXmindImport()调用common\model.php#deny()
    • deny()方法在$this->app中添加user字段并存入session
  2. 认证绕过原理

    • 正常认证检查$this->app->user是否存在且account不等于guest
    • 通过漏洞创建的session包含user字段,绕过认证检查
  3. 修复后验证

    • 修复版本使用$this->loadModel('user')->isLogon()
    • isLogon()检查$this->session->user,未登录时为null

漏洞利用扩展

testcase.savexmindimport外,其他调用deny()的方法也可实现认证绕过,例如:

  • testcase.getxmindimport

防御措施

  1. 升级到最新版本:

    • 开源版 >= 18.12
    • 企业版 >= 8.12
    • 旗舰版 >= 4.12
  2. 临时缓解方案:

    • 禁用或限制testcase.savexmindimport等白名单方法的访问
    • 加强API接口的权限验证

技术要点总结

  1. 关键漏洞点

    • 白名单方法未正确验证会话状态
    • deny()方法错误设置用户会话
  2. 利用条件

    • 能够访问系统API接口
    • 存在调用deny()的白名单方法
  3. 影响范围

    • 可调用任意API接口
    • 可修改管理员密码
    • 可配合其他漏洞实现服务器完全控制

参考链接

  • 官方修复提交:https://github.com/easysoft/zentaopms/commit/d13ba70016ca981b08f27e08fb934bf1f23a4135
禅道项目管理系统身份认证绕过漏洞分析(QVD-2024-15263) 教学文档 漏洞概述 禅道项目管理系统存在一个严重的身份认证绕过漏洞,远程攻击者可以利用该漏洞绕过系统认证机制,调用任意API接口并修改管理员用户密码,最终实现系统完全控制。 影响版本 开源版:16.x <= 禅道项目管理系统 < 18.12 企业版:6.x <= 禅道项目管理系统 < 8.12 旗舰版:3.x <= 禅道项目管理系统 < 4.12 漏洞复现步骤 获取认证Cookie : 此请求会返回一个有效的会话Cookie 验证漏洞存在 : 使用获取的Cookie访问用户API接口: 响应为 error: no company-browse priv. 表示漏洞存在, Unauthorized 则表示系统已修复 漏洞详细分析 认证流程分析 应用初始化 : 程序首先创建app实例: $app = router::createApp('pms', dirname(dirname(__FILE__)), 'api'); 调用 router.class.php#startSession() 生成sessionID 权限验证 : 执行 $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