禅道项目管理系统-远程命令执行漏洞源码分析
字数 1418 2025-08-11 08:36:24

禅道项目管理系统远程命令执行漏洞分析与复现

1. 漏洞概述

禅道研发项目管理软件是国产开源项目管理软件,专注研发项目管理,内置需求管理、任务管理、bug管理等功能,已为100万+项目提供服务。

2023年1月6日披露的漏洞包含:

  • 权限绕过漏洞:攻击者可在无需登录的情况下构造恶意请求
  • 命令执行漏洞:结合权限绕过可执行任意命令,控制服务器

受影响版本

  • 开源版:17.4 ≤ Zentao ≤ 18.0.beta1
  • 旗舰版:3.4 ≤ Zentao ≤ 4.0.beta1
  • 企业版:7.4 ≤ Zentao ≤ 8.0.beta1

2. 漏洞分析

2.1 权限绕过漏洞分析

关键函数调用链

  1. index.php:所有HTTP请求的入口

    • parseRequest():解析请求入口方法
    • setParams():设置被调用方法的参数
    • checkPriv():检查用户权限
    • loadModule():加载相应模块并调用方法
  2. checkPriv函数缺陷

    • 检查是否为重置密码请求 → 检查是否已登录 → 检查用户权限
    • 权限检查失败时调用deny()helper::end()抛出异常
    • 关键问题:异常被捕获但程序继续执行
  3. 绕过方法

    • 构造session['user']即可绕过登录验证
    • 利用captcha函数写入自定义session

2.2 命令执行漏洞分析

漏洞位置

module/repo/model.php中的checkConnection函数:

function checkConnection(){
    if($this->scm == 'Subversion'){
        $command = $this->client . ' --version --quiet';
        exec($command, $output, $return);
        // ...
    }
}

漏洞成因

  1. client参数未经任何校验直接拼接执行
  2. scm值为"Subversion"时触发命令执行

3. 漏洞复现

3.1 权限绕过复现步骤

  1. 利用captcha函数生成自定义session:

    • 一键安装包URL:/misc-captcha-user.html
    • 源码搭建URL:/index.php?m=misc&f=captcha&sessionVar=user
  2. 效果:设置$this->app->user不为空,绕过权限检查

3.2 命令执行复现步骤

两种触发路径:

  1. create函数路径

    • checkClient函数多重校验阻挡
    • 需要满足三个条件之一:
      • scm == "Gitlab"
      • checkClient == false
      • clientVersionFile文件存在
  2. edit函数路径(推荐):

    • 前提:系统已创建仓库
    • 调用链:edit()update()checkConnection()

实际利用:

  1. 先调用captcha获取session
  2. 调用repo/edit执行命令:
    • Linux:使用反引号`
    • Windows:使用%26(&的URL编码)
  3. 验证方式:
    • 推荐使用dnslog或Ceye
    • Windows回显较复杂,建议外带验证

4. 修复方案

官方已于2023年1月12日发布补丁,建议升级到最新版本。

5. 技术要点总结

  1. 权限绕过关键

    • checkPriv异常处理缺陷
    • captcha函数的session写入利用
  2. 命令执行关键

    • client参数未过滤
    • scm == "Subversion"触发条件
    • 多路径选择策略
  3. 跨平台差异

    • Linux与Windows命令执行方式不同
    • Windows下回显限制解决方案

6. 参考资源

禅道漏洞分析原文

禅道项目管理系统远程命令执行漏洞分析与复现 1. 漏洞概述 禅道研发项目管理软件是国产开源项目管理软件,专注研发项目管理,内置需求管理、任务管理、bug管理等功能,已为100万+项目提供服务。 2023年1月6日披露的漏洞包含: 权限绕过漏洞 :攻击者可在无需登录的情况下构造恶意请求 命令执行漏洞 :结合权限绕过可执行任意命令,控制服务器 受影响版本 开源版 :17.4 ≤ Zentao ≤ 18.0.beta1 旗舰版 :3.4 ≤ Zentao ≤ 4.0.beta1 企业版 :7.4 ≤ Zentao ≤ 8.0.beta1 2. 漏洞分析 2.1 权限绕过漏洞分析 关键函数调用链 index.php :所有HTTP请求的入口 parseRequest() :解析请求入口方法 setParams() :设置被调用方法的参数 checkPriv() :检查用户权限 loadModule() :加载相应模块并调用方法 checkPriv函数缺陷 : 检查是否为重置密码请求 → 检查是否已登录 → 检查用户权限 权限检查失败时调用 deny() → helper::end() 抛出异常 关键问题 :异常被捕获但程序继续执行 绕过方法 : 构造 session['user'] 即可绕过登录验证 利用 captcha 函数写入自定义session 2.2 命令执行漏洞分析 漏洞位置 module/repo/model.php 中的 checkConnection 函数: 漏洞成因 client 参数未经任何校验直接拼接执行 当 scm 值为"Subversion"时触发命令执行 3. 漏洞复现 3.1 权限绕过复现步骤 利用 captcha 函数生成自定义session: 一键安装包URL: /misc-captcha-user.html 源码搭建URL: /index.php?m=misc&f=captcha&sessionVar=user 效果:设置 $this->app->user 不为空,绕过权限检查 3.2 命令执行复现步骤 两种触发路径: create函数路径 : 被 checkClient 函数多重校验阻挡 需要满足三个条件之一: scm == "Gitlab" checkClient == false clientVersionFile 文件存在 edit函数路径 (推荐): 前提:系统已创建仓库 调用链: edit() → update() → checkConnection() 实际利用: 先调用 captcha 获取session 调用 repo/edit 执行命令: Linux :使用反引号 ` Windows :使用 %26 (&的URL编码) 验证方式: 推荐使用dnslog或Ceye Windows回显较复杂,建议外带验证 4. 修复方案 官方已于2023年1月12日发布补丁,建议升级到最新版本。 5. 技术要点总结 权限绕过关键 : checkPriv 异常处理缺陷 captcha 函数的session写入利用 命令执行关键 : client 参数未过滤 scm == "Subversion" 触发条件 多路径选择策略 跨平台差异 : Linux与Windows命令执行方式不同 Windows下回显限制解决方案 6. 参考资源 禅道漏洞分析原文