KindEditor开源富文本编辑框架XSS漏洞

0×01 前言

KindEditor 是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开发人员可以用 KindEditor 把传统的多行文本输入框(textarea)替换为可视化的富文本输入框。

KindEditor 使用 JavaScript 编写,可以无缝地与 Java、.NET、PHP、ASP等程序集成,比较适合在CMS、商城、论坛、博客、Wiki、电子邮件等互联网应用上使用。

在最近的渗透测试工作中,接触到了KindEditor输入框架,经过几番测试发现代码对XSS的防护还是挺全面的,感觉到底是开源代码,就是不一样,但是总感觉哪里不对,也就边放弃边继续。

最终发现该框架还是存在一个XSS注入的问题,而且由于利用框架的时候都会将用户输入存入数据库,并对其他用户进行展示,进而引发了危害巨大的存储型XSS漏洞。

0×02 测试过程

首先,你得找到一个(女朋友)使用这种框架的网站,通过查看加载的js文件确认是否包含KindEditor框架(外观如下图):

然后开始测试,随意输入一段字符

我们找的示例网站中,在本地对提交的数据进行了编码,但是很明显可以看出是ASCII Hex编码,解码看到明文。

然后尝试输入可以引入标签的尖括号<> (下图中的<br>是客户端自己添加的)

解码后,我们可以看到开发人员在本地对尖括号进行了HTML编码,上burp,直接截取重放,过了客户端编码。

可是当我们输入<script>时,我们看到了返回结果中已经将该位置的内容重置成了test1(也就是用户名)

这也就意味着服务端中的过滤机制进行了正则匹配的过滤,只要<>包含特定内容,就直接替换成一个固定值。

这样我们就不能成功的引入<>标签了,也就很难加入<script>标签,但是该位置的内容也不能结合属性标签进行注入,所以我们还是要想新的办法来先过服务端的过滤机制。

尝试对<>进行编码,但是很不幸的是,进行了编码后,发现返回的内容要么乱码,要么是标签被作为内容直接插入,如下图(如果是标签会被标识为蓝色)。

这就意味着服务端是过了,但是KindEditor对输出的内容进行了转义,使其不能作为标签插入HTML页面中。

接着又尝试输入空标签<>

输入空标签之后,我们看到<script>标签已经被完整返回回来了,但是总感觉开源代码不会这么简单,果然在相关页面上,alert语句并没有被执行,但是在html文档中可以看到<script>已经被成功识别为一个标签了。

分析原因,应该是,在我们的<script>标签插入html文档中的时候,整个页面已经load完成了,所以<script>标签并没有执行。

既然,<script>标签没有被执行,那我们可以通过事件方案来触发进行执行啊,所以开始引入onclick事件,

从返回结果来看,一切都那么完美,感觉就要胜利了,然而当我们将鼠标点上去的时候,所有的幻想都破灭了,弹出一个新标签页,然后什么也没有了,说好的弹窗呢。查看页面

完美的开源代码,将事件处理函数修改了,所以不能成功执行。通过测试其他的事件和使用JavaScript伪协议,都是同样的问题,在on和java之后添加了下划线。到底是开源代码,服了,好吧,该放弃这个女朋友了。

但是总感觉哪里有问题,不该是这样的结局,开始重新整理思路: <>空标签可以帮我们绕过服务端基本的过滤机制,但是新加入的<script>不能被成功执行,事件处理函数又被KindEditor给清洗了,那可不可以试试其他标签,不需要其他通过事件监听来触发的标签呢,还真被我找到了,成功穿过KindEditor的围堵。

终于,看到了我们最喜爱的弹窗,收工。(由于还在于框架作者进行联系,所以这里不方便透漏具体的注入代码)。

0×03 源码分析

为了确定是网站开发人员使用的问题还是KindEditor本身的问题,我们前往官网下载它的源代码进行分析。

整个项目的目录结构如下

打开KindEditor-all.js文件,开始分析。

如果KindEditor本身做了处理,肯定是以关键字filter定义的,全局搜索filter。发现代码中filter相关的参数被_formatHtml函数调用。

找到该函数的定义

从函数定义中我们可以看到KindEditor确实对输入内容进行了相关的过滤,只是在过滤时并未完美处理所有的输入情况。通过分析源代码我们也可以看到,KindEditor确实也没有对我们输入的标签进行过滤,从而引发了XSS注入的问题。

0×04 总结

从KindEditor的官方网站http://kindeditor.net的案例页面我们可以看到国内还是有很多网站使用了相关技术,下面是一些使用这些网站的厂商。

但是之后,对上面提到的网站进行测试,发现其中的一部分网站已经没有在使用相关代码了,但是从KindEditor的github主页上看到还是有很大一部分人关注这一项目,这就证明还是有很多人在使用这一框架。

只要使用就可能会存在这样的存储型的XSS漏洞,至于XSS漏洞的危害,就不需要多说了。

0×05 防范措施

在开发过程中开发人员不能过度依赖第三方库所做的防范,还是需要在内容输出时进行Html编码,或者完善已有的过滤规则,从而杜绝类似的注入攻击。

0×06 感谢

感谢斌爷在整个测试过程中对我前端相关技术的指导,这个女朋友有你一半。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-03-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jerry的SAP技术分享

ABAP system landscape和vue项目webpack构建的最佳实践

基于Netweaver的ABAP transport route一般都有dev,test和prod三种类型的系统。

13030
来自专栏IT大咖说

vSAN架构解析与6.7功能介绍

内容来源:2018 年 7 月 17 日,VMware大中华区原厂高级技术讲师史峻在“VMware直播分享 第二期”进行《vSAN架构解析与6.7功能介绍》演讲...

33730
来自专栏漫话前端

浏览器已原生支持 ES 模块,这对前端开发来说意味着什么?

还记得当初入门前端开发的时候写过的 Hello World 么?一开始我们先创建了一个 HTML 文件,在 <body> 标签里写上网页内容;后来需要学习页面交...

38570
来自专栏云计算教程系列

如何在Ubuntu 14.04上安装和使用ArangoDB

ArangoDB是一个NoSQL数据库。它创建于2011年,当时已有许多NoSQL数据库,其目标是成为一个涵盖各种用例的综合数据库解决方案。

55300
来自专栏FreeBuf

滥用Edge浏览器的“恶意站点警告”特性,实现地址栏欺骗

前言 在过去的几个月里,我们看到使用这种以技术支撑的骗术日益增多,用户的浏览器会被辣眼睛的红屏以及类似”你的电脑可能存在风险”的提示消息”锁定”。当然,这种情形...

25290
来自专栏腾讯社交用户体验设计

高效编写微信小程序-你还在手动创建新项目吗?

30530
来自专栏Crossin的编程教室

【Python 第20课】 命令行常用命令

【Python 第20课】 命令行常用命令 今天茬开话题,说一下命令行(Windows下叫“命令提示符”,Mac下叫“终端”)里的常用命令。已经熟悉同学可略过。...

34750
来自专栏BeJavaGod

通过spring实现javamail的那些事儿

以前很早的时候大家都用javamail实现发送邮件的功能,而且我们也一直沿用至今,代码拷过来用用就行了,现在我们改为用spring来实现,这样一来减少代码的复杂...

30440
来自专栏微服务生态

利用多写Redis实现分布式锁原理与实现分析

在我写这篇文章的时候,其实我还是挺纠结的,因为我这个方案本身也是雕虫小技拿出来显眼肯定会被贻笑大方,但是我最终还是拿出来与大家分享,我本着学习的态度和精神,希望...

14730
来自专栏谈补锅

<转>iOS性能优化:Instruments使用实战

最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下。

12220

扫码关注云+社区

领取腾讯云代金券