- A+
显示不全请点击全屏阅读
昨天发现有人暴出了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:
如果您喜欢我的博客,欢迎点击图片定订阅到邮箱 也可以点击链接【订阅到鲜果】
如果我的想法或工具帮助到了你,也可微信扫下方二维码打赏本人一杯咖啡