禅道的前世今生-下
前言
上文介绍了如何绕过禅道前台的权限校验进入后台,本文将详细介绍禅道后台RCE的各种姿势。
文件包含
1. api-debug
漏洞成因
未校验的filePath参数,最终导致文件包含。
影响范围
低于17.7版本
漏洞分析
在禅道的低版本的分析里就介绍了这个文件包含的利用方式。
不过getModel方法需要开启配置才能使用。
api控制器的debug方法,接受一个filepath参数,并传入api模块getMethod方法。
执行dirname
函数后,传入helper::import
,将其包含进来。
其实这里代码逻辑是说不通的,一个目录名应该是不能被当作文件包含进来的。
可以传入 xxxxx/tmp/shell.jpg/123
使其能够正确包含到我们的木马文件。
漏洞修复
漏洞限制了可包含文件的绝对路径,无法包含用户上传的文件了。
2. block-printViewFile
漏洞成因
框架在调用控制器方法时,没有限制不能调用父类的共有方法。
影响范围
[16.0,18.12)
漏洞分析
printViewFile 是 control类的方法,control类是所有控制器的父类,此方法访问权限是public,所以所有子类都可以调用,所以它自然也可以作为接口访问。
可能有人好奇,为什么是 block 模块,因为在仅能伪造session,通过user->isLogon()
校验,但是无法通过进一步的权限校验的版本里,也就是只能执行isOpenMethod 方法内允许的控制器和方法。
其中,当控制器为block时,是允许调用任意方法的。
但是变量同样是接口参数,仅能出现在GET或者路径参数中,路径参数不能传入../
有关的,这取决于禅道的配置 requestType 为 GET 或者 PATH_INFO,第一个文件包含漏洞是因为传入的路径穿越参数是经过Base64加密的。
如果是PATH_INFO ,就不能利用了吗?
我先给出答案。
api.php/0/?m=block&f=printViewFile
这是因为api.php 中,如果解析出版本为空,
会设置请求类型为GET,
同时调用原始的加载控制器的逻辑。
漏洞修复
在18.12版本里,禅道限制了viewFile的条件,在指定目录内的php文件,不能有目录穿越
命令注入
1. repo-edit
漏洞成因
在接入代码仓库时,使用系统命令来识别和使用代码仓库,但是代码仓库类型未作校验,导致了命令注入.
影响范围
[15.0,18.1)
漏洞分析
在更新一个代码库时,
如果用户输入的对象 SCM 属性为 Subversion,且 path 不等于 原来的 path。
会创建一个Subversion的引擎。
这里的变量均来自用户输入。
这里的client参数拼接到exec危险函数中,造成命令注入。
但是在修改代码仓库需要先有一个存在的代码仓库。创建代码库有两个校验。
checkClient 和 checkConnection
其中checkClient
如果SCM为 Gitlab,那么返回true,配置checkClient 为false,也返回true,但checkClient默认为true。
而且需要clientVersionFile 文件存在,该文件需要管理员手动在服务器上执行一条命令,走不通。
所以只能post SCM为Gitlab,同时也能通过checkConnection的校验。
所以可以先创一个 Gitlab代码库,然后再将其修改为恶意的Subversion代码库即可RCE。
在低版本的禅道比如15版本的,里面是没有checkClient方法的,可以直接创建仓库时RCE。
在18.0版本的repoModel-update
方法中
直接调用了checkConnection
方法,
同样也需要修改一个已经存在的代码仓库。
漏洞修复
在18.1版本中,重构了修改代码仓库的逻辑。
如果新仓库的client不等于旧仓库的,则需要重新调用checkClient方法。而checkClient 只有在 client为Gitlab时才能通过。
而且,新仓库在创建时,如果仓库是Gitlab,client会被置空。
导致在client字段内注入恶意命令。
2. zahostModel-ping
漏洞成因
未对输入的ip进行格式校验,最终造成命令注入
影响范围
[18.0,18.3]
漏洞分析
禅道18.0新增了创建宿主机的功能,该功能允许在创建一个宿主机时,对IP/域名进行ping检查。
这里的address并没有经过校验,造成命令注入漏洞。
漏洞修复
18.4版本中,
对地址进行了 合法IP的校验。
任意文件上传
1. license-uploadLicense
漏洞成因
使用pclzip解压用户上传的压缩包,pclzip解压时存在目录穿越问题,导致了任意文件上传。
影响范围
低于18.11
漏洞分析
这里接收用户上传的文件
然后使用pclzip 解压到指定目录下。
这里可以使用 ../../xxx.php
,将木马解压到web可访问目录下。
当然,不是所有的环境下木马都可以被访问的,使用禅道docker或一体化安装包安装时,禅道会提供一个apache服务器,服务器会加载.ztaccess文件(同.htaccess,禅道修改了加载的文件名),.ztaccess 限制了web目录下可访问的php文件,其他目录下的php会被当做文本访问,不解析,所以上传时需要配合上传一个 .ztaccess 文件,利用同 .htaccess 文件上传
。
漏洞修复
18.11 移除了该接口
2. transfer-import
漏洞成因
使用pclzip解压用户上传的压缩包,pclzip解压时存在目录穿越问题,导致了任意文件上传。
影响范围
[18.0-18.12]
漏洞分析
禅道18.0 版本中新增了transfer模块,import方法会对上传的xlsx文件进行解压,xlsx表格文件也是一个zip。
同样也是使用pclzip 对用户上传的文件进行解压。
漏洞修复
在禅道20.1版本里,去除了import方法中解压xlsx文件的功能。
3. testcase-importXmind
漏洞成因
使用pclzip解压用户上传的压缩包,pclzip解压时存在目录穿越问题,导致了任意文件上传。
影响范围
[18.4,18.12]
漏洞分析
禅道18.4新增了 testcase-importXmind 方法,同样存在解压文件目录穿越的问题。
漏洞修复
在20.1版本里对漏洞进行了修复
仅可以解压白名单内的文件。
原文始发于微信公众号(天命团队):禅道的前世今生-下
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论