禅道项目管理系统(ZenTaoPMS)高危漏洞分析与利用
2021-01-05 11:40:00 Author: xz.aliyun.com(查看原文) 阅读量:763 收藏

一、组件介绍

1.1 基本信息

ZenTaoPMS(ZenTao Project Management System),中文名为禅道项目管理软件。ZenTaoPMS是易软天创公司为了解决众多企业在管理过程中出现的混乱,无序的现象,开发出来的一套项目管理软件。

禅道项目管理软件的主要管理思想基于国际流行的敏捷项目管理方式——Scrum。scrum是一种注重实效的敏捷项目管理方式,但众所周知,它只规定了核心的管理框架,但具体的细节还需要团队自行扩充。禅道在遵循其管理方式基础上,又融入了国内研发现状的很多需求,比如bug管理,测试用例管理,发布管理,文档管理等。因此禅道不仅仅是一款scrum敏捷项目管理工具,更是一款完备的项目管理软件。基于scrum,又不局限于scrum。

禅道还首次创造性的将产品、项目、测试这三者的概念明确分开,产品人员、开发团队、测试人员,这三者分立,互相配合,又互相制约,通过需求、任务、bug来进行交相互动,最终通过项目拿到合格的产品。

1.2 版本介绍

禅道项目管理软件基于自主研发的PHP开发框架---禅道PHP框架开发而成,企业或者第三方的开发者可以通过这套框架,灵活的对禅道进行功能的修改或者扩展。经过逐年演化,禅道项目管理软件发展成为四大系列、功能完善的项目管理软件。禅道项目管理软件发展至今其核心开发系列共有以下三个,即禅道企业版、禅道专业版、禅道集团版、禅道开源版。其中禅道开源版是基础版本;而专业版、企业版是根据禅道开源版进行二次开发而成,其间仅存在功能性上的不同,所以专业版、企业版是兼容同级开源版的;而集团版仅为部署架构上的不同,核心还是企业版,具体如下:

(1)禅道开源版(2009-2020)是禅道项目管理软件的基础版本,属于禅道项目的开发框架,其中仅开发了项目管理的基本模块。

(2)禅道专业版(2012-2020)是在禅道开源版的基础上增加增强功能。专业版推出的初衷是为IT企业或部门提供更完善的服务,专业版增强功能更加适合企业的内部流程化管理。同时专业版的增强功能都以收费插件的方式发布在禅道官网里,为用户提供单独下载使用的服务。

(3)禅道企业版(2017-2020),在禅道专业版功能的基础上,增加了运维管理、OA办公管理、反馈管理,以及文档的版本管理及在线预览等功能,可以为企业项目管理流程提供更全面的支撑。

(4)禅道集团版(2019-2020)主要包含主站平台和子站点两部分。集团版用户可以通过主站平台给旗下的 部门、 子公司或者第三方开发团队分别开通一个独立的子站点进行项目管理。集团版的子站点由禅道项目管理软件企业版提供项目管理服务, 每个子站点的数据都是独立且互不影响的。

版本细分如下图所示:

1.3 使用量及使用分布

根据全网数据统计,使用ZenTaoPMS的网站多达4万余个,其中大部分集中在国内,约占使用量的75%以上。其中,广东、浙江、北京、上海四省市使用量最高,由此可见,ZenTaoPMS在国内被广泛应用。通过网络空间搜索引擎的数据统计和柱状图表,如下图所示。


(数据来源:FOFA)

二、高危漏洞介绍

通过对ZenTaoPMS漏洞的收集和整理,过滤出其中的高危漏洞,可以得出如下列表。

漏洞名称 漏洞ID 影响版本 漏洞披露日期
禅道 8.2-9.2.1 SQL注入导致前台Getshell 禅道开源版 8.2-9.2.1 2018
禅道 后台代码注入漏洞 禅道开源版 <= 11.6 2019
禅道 后台任意文件删除漏洞 禅道开源版 <= 11.6 2019
禅道 后台任意文件读取漏洞 禅道开源版 <= 11.6 2019
禅道 后台文件包含漏洞 禅道开源版 <= 11.6 2019
禅道 后台SQL注入漏洞 禅道开源版 <= 11.6 2019
禅道 任意文件上传漏洞 CNVD-C-2020-121325 10.x < 禅道开源版 < 12.4.3 2020
禅道 Pro 8.8.2 命令注入漏洞 CVE-2020-7361 禅道Pro <=8.8.2 2020

从以上表可以看出,近年来禅道漏洞频发,从2018年开始,每年都会爆出比较严重的高危漏洞,通过这些高危漏洞均可对服务器造成一定的影响,甚至获取服务器的最高权限。

从漏洞分布的情况来看,禅道大部分的漏洞均属于后台漏洞,这源于禅道属于项目管理软件,均需要登录授权后方可操作系统中的任意模块,而系统中的未授权接口很少,在18年爆发一个未授权漏洞后,官方将对外开放的接口全部筛选修复后,就导致对外开发接口极少,切很难有漏洞利用点,故截止到现在,禅道所爆发的漏洞均需要后台一定的权限账户方可执行。

我们可以看到2018年禅道爆发出多个漏洞,其实这些漏洞原理基本一致,均为越权调用getModel函数导致,后面我们会在详细分析中讲解该部分漏洞的原理。另外,我们发现禅道爆发的漏洞基本存在于开源版,但这不意味着这些漏洞仅存在于开源版,开源版是禅道其他系列的基础框架版本,所以开源版的漏洞大概率也会在于对应兼容系列的对应版本中。且禅道具有可扩展性,所以大部分使用者均可采用开源版,在进行二次开发,适用到自己项目中。

三、漏洞利用链

基于ZenTaoPMS高危漏洞,我们可以得出几种可以利用的高危利用链。

3.1 无需权限

ZenTaoPMS (8.2-9.2.1) - GetShell

  • 首先明确ZenTao框架系列版本,访问该路径可获取版本信息:/zentao/index.php?mode=getconfig
  • 如果利用此漏洞,需要系统有文件写入权限。

3.2 仅需低权限

ZenTaoPMS <11.6 - GetShell

  • 首先明确ZenTao框架系列版本,访问该路径可获取版本信息:/zentao/index.php?mode=getconfig
  • 需要获取到ZenTaoPMS的后台用户登录账号密码或者cookie,执行以上漏洞生成shell,最终可getshell。

3.3 需要管理员权限

ZenTaoPMS < 12.4.3 - GetShell

  • 首先明确ZenTao框架系列版本,访问该路径可获取版本信息:/zentao/index.php?mode=getconfig
  • 需要获取到ZenTaoPMS的后台管理员账户登录账号密码或者cookie。
  • 漏洞只适用于Windows一键安装版(未加安全限制)、Linux一键安装版(未加安全限制)、安装包版。Windows/Linux一键安装版(加入安全限制)由于做过新上传文件限制,无法执行上传后的文件,导致漏洞无法利用。

ZenTaoPMS Pro <= 8.8.2 - GetShell

  • 需要获取到ZenTaoPMS的后台管理员账户登录账号密码或者cookie。
  • 该漏洞命令执行无回显,可通过certutil.exe下载安装远程可利用恶意软件,最终getshell。

四、高可利用漏洞分析

4.0 技术背景:禅道项目管理系统路由模式

禅道有两种路由模式PATH_INFO、GET方式,其中GET方式为常见的m=module&f=method形式传递模块和方法名,而PATH_INFO则是通过路径和分隔符的方式传递模块和方法名,路由方式及分隔符定义在config/config.php中。

  • PATHINFO:user-login-L3plbnRhb3BtczEwLjMuMS93d3cv.html 以伪静态形式在html名称中传参
  • GET:index.php?m=block&f=main&mode=getblockdata 类似于其他常规cms在get参数中传参我们

我们从禅道的入口index.php文件来进行讲解:

index.php文件,首先看到加载了一些framework中的框架类,然后声明了一个路由$app,之后就做了一些系统的基本判断,最重要的就在最下方的三句话,分别是三个功能:解析请求、检测权限、加载模块;

$app->parseRequest();
$common->checkPriv();
$app->loadModule();

即parseRequest()函数就是路由解析入口。进入到\framework\base\router.class.php文件中的parseRequest()函数:

parseRequest()函数首先用于解析判断url是否采用了'GET'或者是'PATH_INFO'模式,其中有一个点就是isGetUrl()函数,该函数用于判断url是否采用了GET模式,具体有以下三种模式:

我们回到parseRequest()函数中可以得出,如果系统的默认解析模式是PATH_INFO,而你的url采用的是GET模式,系统则会将此次访问的路由解析模式配置修改GET,故当你的url模式与系统默认解析模式不同,系统也会解析,不会报错。所以禅道系统的两种路由解析模式可同时使用。

(1)路由解析中,GET模式属于非默认模式,但是该种解析方式是PHP类CMS的常规解析模式,即m=block&f=main,m参数负责传递模块名(module),f参数负责传递方法名(method),由此就可以定位到对应module中的control.php文件,以及该文件中对应的method。

(2)路由解析中,PATH_INFO模式属于系统默认模式,我们在配置文件中可以看到系统默认模式以及对应的分隔符、参数含义:

我们可以看出PATH_INFO的默认分隔符是 -,然后我们进入到path_info模式下的setRouteByPathInfo()函数,通过分隔符将url分割后,第一个值为模块名称module,第二个值即为方法method:


文章来源: http://xz.aliyun.com/t/8692
如有侵权请联系:admin#unsafe.sh