漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2014-054861
漏洞标题:cmseasy某处点击触发xss
相关厂商:cmseasy
漏洞作者: phith0n
提交时间:2014-03-30 15:42
修复时间:2014-06-25 15:43
公开时间:2014-06-25 15:43
漏洞类型:xss跨站脚本攻击
危害等级:中
自评Rank:8
漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
2014-03-30: 细节已通知厂商并且等待厂商处理中
2014-04-04: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2014-05-29: 细节向核心白帽子及相关领域专家公开
2014-06-08: 细节向普通白帽子公开
2014-06-18: 细节向实习白帽子公开
2014-06-25: 细节向公众公开
简要描述:
点击触发,鸡肋一些。
详细说明:
cmseasy是一款轻型cms,虽然这么说,但它也有bbs功能,其中bbs发帖处就有一个富文本框。
但最新版的cmseasy过滤函数非常厉害,形式类似于会在敏感代码里加“<x>”,但cmseasy的规则更加严格,过滤了style和expression。看下图:
但它依旧是没有处理好伪协议的部分。因为a和href没有过滤(也不可能过滤),所以我们可以借助href=javascript:xxx来执行javascript。但我们看到,$ra1 = array('javascript'这里直接就过滤了javascript这个关键词,怎么办?
读到这里,大家应该很快就能反应过来,当然是用字符编码。对,因为javascript是在href这个属性中的,所以我们可以用html实体替换。比如用r替换r。这样:
但我们再读源码:
这里似乎过滤了html实体呢。这个for循环的功能就是将html实体替换成原字符,比如我们这里的javascript经过这个循环后就变成了javascript,然后就被后面的fliter过滤了。
怎么办?
既然它把html实体替换成了原字符,那么这样写呢:&#114;
1被替换成了1,和外面的字符又组成了新的r。好,这样我们试试能不能绕过fliter:
我们在cmseasy中试试。注册用户,到bbs目录下,发帖:
点击Click me触发:
所以,虽然这个xss fliter看似十分变态,过滤了很多很多标签和属性。但某些标签和属性是不可能过滤的。比如img、a、href、src,因为这都是一些正常到不能再正常,富文本中必须用到的标签。
但因为有了伪协议的存在,所以这些标签也变得十分危险。
漏洞证明:
见详细说明。
修复方案:
我提供几个建设性的方案。
. 放弃黑名单,使用白名单方式过滤xss。推荐使用一个强大的类库HTML Purifier:http://htmlpurifier.org/ 。这个类简单易用,最精简的过滤代码只要这几行即可:
<?php
require_once 'library/HTMLPurifier.includes.php';
$dirty_html = <<<EOF
<h1>Hello
<script>alert("world");</script>
EOF;
$purifier = new HTMLPurifier();
$cleanHtml = $purifier->purify($dirty_html);
它能够自动补全html标签,这段代码最后输出的是<h1>Hello</h1>。这里有他的一些过滤规则:http://htmlpurifier.org/live/smoketests/xssAttacks.php
b). 使用UBB代码。类似于白名单的过滤,用户只能使用UBB代码中允许的标签和属性,不允许的直接不会显示出来。国内discuz论坛、国外的phpbb论坛,对于UBB代码已经做的很成熟了,可以借鉴。
既有ubb编辑器:http://www.ubbeditor.com/cn/
其还给了php、asp、c#、java语言的ubb转换html的后端代码,可以参考:http://www.ubbeditor.com/cn/download/
c). 使用markdown处理富文本。效果类似于ubb代码,但处理的脚本在前端,也算是近些年比较流行的一个方式。
但我并没有细致去研究javascript是怎么处理的markdown代码,所以对其解析的安全性,可能还有待观察。
pagedown可参考:https://code.google.com/p/pagedown/
版权声明:转载请注明来源 phith0n@乌云
漏洞回应
厂商回应:
危害等级:无影响厂商忽略
忽略时间:2014-06-25 15:43
厂商回复:
最新状态:
2014-04-04:官方并没收到漏洞通知