斗象漏洞情报中心分享|禅道命令注入漏洞深度分析
斗象漏洞情报中心分享|禅道命令注入漏洞深度分析
原创 斗象TCC实验室 斗象智能安全 2023-01-19 13:49
01
漏洞概述
1月6日,斗象漏洞情报运营中心监测到公网公开披露了禅道研发项目管理系统存在命令注入漏洞并发布了漏洞预警。
禅道研发项目管理软件是国产的开源项目管理软件,专注研发项目管理,内置需求管理、任务管理、bug管理、缺陷管理、用例管理、计划发布等功能,实现了软件的完整生命周期管理。
未经身份验证的攻击者可以利用此漏洞绕过权限检查,在服务器上执行任意命令;
1月12日官方发布了漏洞修复补丁。
近日,运营团队复现了漏洞发现过程并对系统源码进行分析,还原漏洞产生原因,详见下文。
02
影响范围
17.4 <= 禅道研发项目管理软件 <= 18.0.beta1 (开源版)
3.4 <= 禅道研发项目管理软件 <= 4.0.beta1(旗舰版)
7.4 <= 禅道研发项目管理软件 <= 8.0.beta1(企业版)
03
复现环境
Apache:2.4.39
PHP:php7.4.3
Mysql:Mysql8
禅道:ZenTaoPMS.18.0.beta1.php7.2_7.4
04
漏洞复现
首先获取session
接着创建代码库
然后执行命令
05
代码分析
查看开源版代码更新:
https://gitee.com/wwccss/zentaopms/commit/2fc604895db2afe61fc8d5bf9ca6ce6baa995e15
可以看到在修复前,捕获到抛出的错误后仅仅是输出并未退出脚本运行,而这个函数的作用是检查用户是否拥有某项权限:
在经过检查之前需要先过第2428行if(isset($this->app->user)),$this->app->user
赋值流程如下:
只要session不为空那就可以调用任意方法了,接下来就是找可以写session的功能点
经过一番查找,
module\misc\control.php中存在一个自定义session的方法
这样,就可以调用任意方法了。
在
module\repo\model.php:
checkConnection()
中存在一个执行命令的代码,且命令是直接拼接的,只有一个条件需要过,就是POST的SCM参数值需要为“Subversion”
只要控制client即可执行任意命令,且是执行两次,查看都有谁调用了此函数
首先看module\repo\model.php:create()
首先需要过checkClient()
可以看到它是用来检测服务器的,当$this->post->SCM == ‘Gitlab’
时,直接返回true,虽然可以过checkClient函数,但是checkClient函数与checkConnection函数所需的SCM参数值是有冲突的,这样的话creat函数就不能利用了。
再看
module\repo\model.php: update($id)
首先是module\repo\model.php:getRepoByID($id)
可以看到如果未在数据库中找到相关数据,其并没有直接抛出错误,只是返回了false或者空数据,这样id就可以随意传了。
然后进入module\repo\model.php:checkConnection()就可以执行命令
在controller中,create是存在路由的,但是update不存在,需要借助edit路由进入update函数
先看
$this->commonAction($repoID, $objectID)
getRepoPairs($tab, $objectID)这里也是直接从数据库查东西,注意这里是select(‘*’),表明是zt_repo
如果库里没东西,就会进入commonAction的最后一个if中
而locate函数这里会有退出脚本操作
所以回到
module\repo\control.php:edit($repoID, $objectID = 0)中我们就必须过
$this->commonAction($repoID, $objectID),也就禅道数据库zt_repo表中必须有东西,这也就需要借助
module\repo\model.php:create()函数去新增一条数据来保证
module\repo\control.php:edit($repoID, $objectID = 0)能顺利进入
module\repo\control.php:update ($id)函数。
06
修复建议
6-1版本升级
厂商已发布了漏洞修复程序:
禅道研发项目管理软件 > 18.0.beta1 (开源版)
禅道研发项目管理软件 > 4.0.beta1(旗舰版)
禅道研发项目管理软件 > 8.0.beta1(企业版)
最新版官方下载链接:https://www.zentao.net/
6-2代码修复
若不方便升级可以在module\common\model.php:checkPriv()最后加上die($endResponseException->getContent());来临时修复权限绕过,示例如下:
本文以安全研究为目的,分享对该漏洞的研究和复现过程,仅供学习和参考。