您的位置 » 首页 » 代码审计,实用工具 » 代码审计:cmseasy{易通CMS}v5.5 任意文件上传漏洞简单分析附利用方法

代码审计:cmseasy{易通CMS}v5.5 任意文件上传漏洞简单分析附利用方法

发表于4年前 | 作者: seay | 分类: 代码审计, 实用工具 | 孵化于:2013年05月11日 | 文章热度:7,981 次 全屏阅读

显示不全请点击全屏阅读

昨天发现有人暴出了cmseasy v5.5的任意文件上传漏洞,还附带了exp。利用该漏洞可以直接上传webshell等恶意文件,危害巨大且目前官方还未出任何补丁,这里做一下简单的漏洞分析。

利用入口位于:

http://www.site.com/editor/editor/dialog/imageuser_mt_mt.php/index.php?case=user&act=log

 

 

通过该页面就可以上传任意文件到服务器了。

看下imageuser_mt_mt.php的代码:

 

$_GET=array('case'=>'user','act'=>'fckupload');
include_once dirname(dirname(dirname(dirname(__FILE__)))).'/index.php';

 包含了index.php并指定了case和act,因为cmseasy实现各个功能的文件都在\lib\default\目录下,我们到该目录下找到user_act.php文件并定位到fckupload函数:

function fckupload_action() {
        $uploads=array();
        if(is_array($_FILES)) {
            $upload=new upload();
            foreach($_FILES as $name=>$file) {
                $uploads[$name]=$upload->run($file);
            }
            $this->view->uploads=$uploads;
        }
        $this->render('../admin/system/fckupload.php');
        exit;
    }

 

进入进入run()函数(位于\lib\tool\front_class.php):

class upload {
    public $path;
    public $type=array('jpg','gif','png','doc','flv','rar');
    public $max_size=2048000;
    public $min_size=0;
    public $dir='images';
    function run($attachment) {
        $this->max_size=config::get('upload_max_filesize') * 1024000;
        if (!isset($this->url_pre))
            $this->url_pre='upload/'.$this->dir.'/'.date('Ym');
        $this->path=ROOT.'/'.$this->url_pre;
        tool::mkdir($this->path);
        if (!$attachment['name']) {

            return false;
        }
        $new_name=$new_name_gbk=str_replace('.','',Time::getMicrotime()).'.'.end(explode('.',$attachment['name']));
        $content=file_get_contents($attachment['tmp_name']);
        if (!front::checkstr($content)) {
            return false;
        }
        if (strlen($content) >$this->max_size) {
            return false;
        }
        move_uploaded_file($attachment['tmp_name'],$this->path.'/'.$new_name_gbk);
        $this->save_path=$this->path.'/'.$new_name_gbk;
        if ($_GET['site'] != 'default') {
            $ftp=new nobftp();
            $ftpconfig=config::get('website');
            $ftp->connect($ftpconfig['ftpip'],$ftpconfig['ftpuser'],$ftpconfig['ftppwd'],$ftpconfig['ftpport']);
            $ftperror=$ftp->returnerror();
            if ($ftperror) {
                exit($ftperror);
            }
            else {
                $ftp->nobchdir($ftpconfig['ftppath']);
                $ftp->nobput($ftpconfig['ftppath'].'/'.$this->url_pre.'/'.$new_name,$this->save_path);
            }
        }
        return $this->url_pre.'/'.$new_name;
    }
}

 

可以看到类开始处明明定义了允许上传的类型

public $type=array(‘jpg’,'gif’,'png’,'doc’,'flv’,'rar’);

 

但之后的处理过程中却没有用到,直接通过move_uploaded_file把上传的临时文件存到了对应的目录中。


整个过程已经明显的不能再明显了,感觉这个漏洞更像别人留下的一个隐藏的后门。。

 

 

最后给出补丁建议:

在\lib\tool\front_class.php文件中,第2665行左右的move_uploaded_file函数上方添加如下语句:

if (!$new_name ||!preg_match('/\.(jpg|gif|png|bmp)$/',$new_name)) {
                    return false;
}

 

作者:风井

 

Tags:

cmseasy漏洞,

如果您喜欢我的博客,欢迎点击图片定订阅到邮箱填写您的邮件地址,订阅我们的精彩内容: 也可以点击链接【订阅到鲜果】

如果我的想法或工具帮助到了你,也可微信扫下方二维码打赏本人一杯咖啡


来自 Seay互联网安全博客
本文地址:http://www.cnseay.com/2844/
文章版权说明请看置顶文章,尊重作者,转载请以链接形式标明原文地址

马上分享给你的朋友吧~

发表评论

你的大名(必填)

你的邮箱(必填)

评论内容(必填)