⼀次对五指 cms 的任意⽂件删除漏洞挖掘

Andrew 2020-11-20
Web安全 发布于 2020-11-20 16:21:24 阅读 259 评论 0

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

No.1 前言

五指cms由国内专业的⽹站内容管理系统提供商北京五指互联科技有限公司开发,是⼀款开源的内容管理系统,使⽤php5+mysql开发,但是在2017年就停⽌了维护,之前也披露过不少漏洞,接下来就开启挖洞之旅。

No.2 过程

跟进了⼏个⽂件后我们来到了coreframe/app/attachment/admin/index.php:

/**
     * 目录列表方式查看
     *
     * @author tuzwu
     * @createtime 2014-8-1 13:14:29
     * @modifytime
     * @param
     * @return array
     */
    public function dir()
{
        $dir = isset($GLOBALS['dir']) && trim($GLOBALS['dir']) ? str_replace(array('..\\', '../', './', '.\\'), '', trim($GLOBALS['dir'])) : '';
        $dir = str_ireplace(array('%2F', '//'), '/', $dir);
        $lists = glob(ATTACHMENT_ROOT . $dir . '/' . '*');
        if (!empty($lists)) rsort($lists);
        $cur_dir = str_replace(array(WWW_ROOT, DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR), array('', DIRECTORY_SEPARATOR), ATTACHMENT_ROOT . $dir . '/');
        include $this->template('dir', M);
    }

在调用str_replace()函数对dir参数的输入进行过滤时,会将’..', ‘../‘, ‘./‘, ‘.'直接过滤掉,我们这里直接输入”..”,目录直接溢出:

光溢出没什么危害啊,也不能下载或者访问,但是WUZHI CMS后台为了方便自带删除的功能,但是只能删除这一级目录的文件吗?带着疑问继续跟进,我们再看
coreframe/app/attachment/admin/index.php的另一处:

/**
     * 删除文件
     *
     * @author tuzwu
     * @createtime
     * @modifytime
     * @param
     * @return
     */
    public function del()
{
        $id = isset($GLOBALS['id']) ? $GLOBALS['id'] : '';
        $url = isset($GLOBALS['url']) ? remove_xss($GLOBALS['url']) : '';
        if (!$id && !$url) MSG(L('operation_failure'), HTTP_REFERER, 3000);
        if ($id) {
          if(!is_array($id)) {
        $ids = array($id);
      } else {
        $ids = $id;
      }
    foreach($ids as $id) {
      $where = array('id' => $id);
      $att_info = $this->db->get_one('attachment', $where, 'usertimes,path');
      if ($att_info['usertimes'] > 1) {
        $this->db->update('attachment', 'usertimes = usertimes-1', $where);
      }
      else {
        $this->my_unlink(ATTACHMENT_ROOT . $att_info['path']);
        $this->db->delete('attachment', $where);
        $this->db->delete('attachment_tag_index', array('att_id'=>$id));
      }
    }
    MSG(L('delete success'), HTTP_REFERER, 1000);
    }
    else {
        if (!$url) MSG('url del ' . L('operation_failure'), HTTP_REFERER, 3000);
        $path = str_ireplace(ATTACHMENT_URL, '', $url);
        if ($path) {
            $where = array('path' => $path);
            $att_info = $this->db->get_one('attachment', $where, 'usertimes,id');

            if (empty($att_info)) {
                $this->my_unlink(ATTACHMENT_ROOT . $path);
                MSG(L('operation_success'), HTTP_REFERER, 3000);
            }

            if ($att_info['usertimes'] > 1) {
                $this->db->update('attachment', 'usertimes = usertimes-1', array('id' => $att_info['id']));
            }
            else {
                $this->my_unlink(ATTACHMENT_ROOT . $path);
                $this->db->delete('attachment', array('id' => $att_info['id']));
                MSG(L('operation_success'), HTTP_REFERER, 3000);
            }
        }
        else {
            MSG(L('operation_failure'), HTTP_REFERER, 3000);
        }
    }
}

对url参数的输入貌似没有做任何控制,首先我们先删除robots.txt

然后我们在url参数这里发现果然没有限制,可以任意文件删除。

原创:杨李李 雷神众测
原文链接:https://mp.weixin.qq.com/s/8aHo8WVG-tZPolo...

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!