禅道的前世今生-下

admin 2025年6月8日00:09:58评论15 views字数 2651阅读8分50秒阅读模式

禅道的前世今生-下

前言

上文介绍了如何绕过禅道前台的权限校验进入后台,本文将详细介绍禅道后台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版本里对漏洞进行了修复

禅道的前世今生-下

仅可以解压白名单内的文件。

原文始发于微信公众号(天命团队):禅道的前世今生-下

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月8日00:09:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   禅道的前世今生-下https://cn-sec.com/archives/3775661.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息