鱼跃CMS2.1.0插件处任意文件上传(删除)

一、源码地址以及版本 http://down.chinaz.com/soft/39353.htm [![](https://cdn-yg-zzbm.yun.qianxin.com/attack-forum/2021/07/attach-9ef768f7f177010c4c8f97bdde23bf5a5bf9dae1.png)](https://shs3...

一、源码地址以及版本
http://down.chinaz.com/soft/39353.htm

二、审计工具
Seay源代码审计系统,phpstrom2020.1.3
三、审计步骤
1.利用Seay自动审计功能观察到到一处可能存在任意文件上传漏洞

2.跟进FIle.php代码进行分析,发现在一个move方法里,大致分析下代码,传入参数为一个移动路径,然后验证文件后缀,check()函数验证用户是否登录,验证是否存在同名文件,检查目录是否可写,然后返回FILE对象实例,包括它的路径以及上传对象本身。

public function move($path, $savename = true, $replace = true)
{
    // 文件上传失败,捕获错误代码
    if (!empty($this->info['error'])) {
        $this->error($this->info['error']);
        return false;
    }
    // 检测合法性
    if (!$this->isValid()) {
        $this->error = 'upload illegal files';
        return false;
    }

    // 验证上传
    if (!$this->check()) {
        return false;
    }

    $path = rtrim($path, DS) . DS;
    // 文件保存命名规则
    $saveName = $this->buildSaveName($savename);
    $filename = $path . $saveName;

    // 检测目录
    if (false === $this->checkPath(dirname($filename))) {
        return false;
    }

    // 不覆盖同名文件
    if (!$replace && is_file($filename)) {
        $this->error = ['has the same filename: {:filename}', ['filename' => $filename]];
        return false;
    }

    /* 移动文件 */
    if ($this->isTest) {
        rename($this->filename, $filename);
    } elseif (!move_uploaded_file($this->filename, $filename)) {
        $this->error = 'upload write error';
        return false;
    }

    // 返回 File 对象实例
    $file = new self($filename);
    $file->setSaveName($saveName)->setUploadInfo($this->info);

    return $file;
}

3.跟进move方法,找到了index.php下有很多方法里使用了该方法,于是逐一定位,发现在pluginlist()处为压缩文件上传以及解压,且方法大致为上传一个压缩文件,放入move方法中获取需要移动到哪个目录,然后进行解压缩到该目录,通过正则匹配压缩内容进行获取插件作者,内容之类的信息返回前端。其中对解压缩的目录访问权限并未设置,可以直接访问,对压缩文件内容也未判断,也就是说可以直接上传带有任意文件的压缩文件,进行上传解压缩,且可以访问。


4.在该插件功能处,发现下方还存在插件删除功能,且未对删除路径参数做任何过滤,可以实现任意文件删除。

四、漏洞复现

1.任意文件上传复现(需要管理员有插件上传功能模块)
1.上传一个test.zip的压缩包,其中test文件夹里有一个phpinfo.php的文件。

2.直接访问网站根目录+plugins/压缩文件夹名字(test)/压缩文件内容(phpinfo.php)

2.任意文件删除复现
1.点击删除抓包。

2.在网站根目录下创建一个testdel的测试文件。

3.修改plugin的文件路径为../testdel,点击放包,成功删除。

4.testdel文件已经删除。

  • 发表于 2021-07-23 11:53:56
  • 阅读 ( 7103 )
  • 分类:漏洞分析

0 条评论

请先 登录 后评论
soufaker
soufaker

8 篇文章

站长统计