Kindeditor特定情况可能会导致全盘浏览的漏洞
因为例子很少,开始想了下不是他们的漏洞,后面想了下,后面没有检查好用户的正常配置内容导致,还是提下吧。 下载地址: 貌似是最新版本的。 测试语言:PHP 测试漏洞文件:/kindeditor/php/file_manager_json.php 默认配置(第16行): $root_path = $php_path . \’../attached/\’; 当/attached/文件夹不存在(被删)或者被改名为一个不存在的目录时,如网上的一个例子: $root_path = $php_path . \’../../../upload/\’; 这个CMS下面的目录根本就没得这个目录,所以就造成了漏洞。 怎么造成了漏洞的呢?我们分析下。
- <?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=imagehttp://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/
修复方案:再验证下绝对路径?
2. 分享目的仅供大家学习和交流,请不要用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布投稿,分享有金币奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务 请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长,可领回失去的金币,并额外有奖!
6. 如遇到加密压缩包,默认解压密码为"www.zyfx8.cn",如遇到无法解压的请联系管理员!
本站部分文章、资源来自互联网,版权归原作者及网站所有,如果侵犯了您的权利,请及时联系我站删除。免责声明
资源分享吧 » Kindeditor特定情况可能会导致全盘浏览的漏洞
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 织梦模板使用说明
- 你下载的织梦模板并不包括DedeCMS使用授权,根据DedeCMS授权协议,除个人非盈利站点外,均需购买DedeCMS商业使用授权。购买地址: http://www.desdev.cn/service-dedecms.html