看到很多地方都发了,那也没必要再藏了…
本地环境:18.0.beta1
影响版本
17.4<=version<=18.0.beta1(开源版)
3.4<=version<=4.0.beta1(旗舰版)
7.4<=version<=8.0.beta1(企业版)
利用条件
无需登录,无条件
权限绕过
登录校验会依次经过:
framework/base/control.class.php->__construct
方法
www/index.php:$common->checkPriv();
补丁对比
通过补丁对比:
module/common/model.php->checkPriv方法
看到将echo $endResponseException->getContent();
修复为了die($endResponseException->getContent());
无需登录白名单:
config/zentaopms.php
在module/misc/control.php的captcha方法当中,存在session赋值
|
|
权限绕过原理:
在设置完session user变量后,会进入module/common/model.php->checkPriv
的if(isset($this->app->user))
分支
接着会进入$this->deny($module, $method);
跟进到module/common/model.php->deny方法
最终会执行到helper::end();
跟进到framework/helper.class.php->end方法
抛出了EndResponseException
异常,而module/common/model.php->checkPriv当中直接接收了异常并输出,之后程序会继续运行,导致权限绕过
而补丁将echo修改为了die,程序走到这里会终止退出,不再继续往后执行,从而修复了权限绕过
SQL注入
通过补丁对比:
module/convert/model.php->dbExists方法
可以看到修复了一处sql注入
全局搜索dbExists
,可以看到在module/convert/control.php的importNotice
方法中进行了调用
对应路由:
/zentao/convert-importNotice
通过注入可以直接写文件,结合之前的权限绕过,可以实现前台文件写入:
|
|
web目录获取
注入写文件需要知道web目录,有很多方法,这里只提供一种
|
|
再提一下:
后台漏洞还有很多,例如命令执行,这里不再赘述,这次的rce重点还是在于权限绕过,结合后台漏洞升级为前台rce