漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2014-060359
漏洞标题:StartBBS开源轻论坛发帖正文处存储型XSS
相关厂商:startbbs.com
漏洞作者: phith0n
提交时间:2014-05-12 11:44
修复时间:2014-08-07 11:46
公开时间:2014-08-07 11:46
漏洞类型:xss跨站脚本攻击
危害等级:低
自评Rank:20
漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
2014-05-12: 细节已通知厂商并且等待厂商处理中
2014-05-17: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2014-07-11: 细节向核心白帽子及相关领域专家公开
2014-07-21: 细节向普通白帽子公开
2014-07-31: 细节向实习白帽子公开
2014-08-07: 细节向公众公开
简要描述:
来一个发帖正文处储存型xss,直接触发,不需用户交互。可盲打管理以及所有用户信息。
StartBBS虽然不算大厂商,但自己在挖洞时的分析使我又学到了很多,又学到了一种绕过技巧。依旧是老问题,富文本xss,很容易出现问题。而且这个位置也很重要,可能有些xss在用户资料或其他位置,但这个xss位置在发帖正文处,如果盲打的话危害很大。
或许能够蠕动起来吧,谁知道呢~
一些其他案例参考:http://www.leavesongs.com/PENETRATION/xss-fliter-bypass.html
详细说明:
startbbs在防御xss上还是下了一些功夫的,但是经常姿势不对,其实开发者可以向一些白帽子咨询一下,也许能得到更好的方法。
默认安装好startbbs后发帖位置是没有编辑器的。我们来到任意一个发帖的页面,可以看到有一个“图片/附件”按钮,点击可以上传图片。
随便上传一个图片,我发现图片地址直接出现在了编辑框中。再结合下面那段话“可以直接粘贴链接和图片地址”,我猜测stratbbs在后台会将我的图片地址用正则匹配出现,并加入<img src=”xxx”>这种标签中,最后显示出来。
类似于markdown,但又比markdown低级一些。想到这里我就又想到,这样的话如果我用双引号将src属性闭合掉,后面就能够加javascript事件了。这样我的输入中不会含有<、>,也没有任何html标签。
我带着这个想法开始看代码。
app/controllers/forum.php 210行开始:
我们输入的数据经过了三个处理:
01 -> 'content' => clearxss($this->input->post ('content'))
02 -> $data['content'] = filter_check($data['content']);
03 -> $data['content'] = format_content($data['content']);
第一个clearxss,是一个国内cms中常见的处理富文本xss的xss fliter,我也曾经绕过过(详见http://www.leavesongs.com/PENETRATION/xss-fliter-bypass.html )。其内容如下:
过滤了很多属性,基本没有可以触发xss的属性了。不过因为startbbs代码的特殊,让这里的fliter形同虚设。
这个之后会讲到。
第二个filter_check函数,具体代码如下:
主要作用是处理<pre>标签,转义代码区域。不过注意一个操作:strip_tags(php中,strip_tags这个函数是用来清楚html标签的)。这个函数很重要,给我的xss帮了大忙。
第三个format_content函数,作用是正则匹配。代码比较多我就不贴了,就是我之前说的,匹配看看某某地址是否是http://xxxx/xxx.gif等,如果是说明是图片文件,就加入img标签中。它匹配图片或链接的正则是这样:
preg_match_all("#(^|\s|\()((http(s?)://)|(www\.))(\w+[^\s\)\<]+)#i", $str, $matches)
并没有处理双引号,我隐隐看到了xss的可能。但仔细观察这个正则,发现当其匹配到空白符、“)”或“<”时就不匹配了。<我们不需要,空白符可以用“/”代替,但“)”绝对不能少啊……javascript中如果没有圆括号,等于说不能执行函数啊,基本就废了。
说完了这三个函数,我再来理一遍思路。首先,我想通过输入一个类似于
这样的畸形url,让后端认为是一个图片地址,然后放入<img src=”xxx”>标签中,变成这样:
从而触发xss。但遇到几个难点:
01.clearxss函数将onerror处理成了on<x>error
02.正则匹配到)就结束了,没有圆括号,onerror=”alert(/xx/”是会出错的。
为了解决第二个问题,我理所当然地想到用html字符实体代替),“)”的html实体是)。但在clearxss函数中,是会处理这个html实体的。会将html实体转换成原来的字符。
我曾经用嵌套来绕过这一限制,当时用的方法是&#41;,让clearxss先把4转换成4,在正好与)组成了一个完整的html实体。但可惜的是,当时要转换的不是)。具体说起来比较麻烦,但在我们这里,转换)用嵌套是不行的。具体为什么不行,读者可以仔细研读clearxss函数,就自然清楚了。
我们回到第二个filter_check函数,里面有一个很重要的操作,调用了strip_tags。说到这里可能有的同学已经懂了。strip_tags会清除所有html代码,比如<x>,比如<div></div>。那么现在,我们的payload就好构造了,在onerror中加一个<div></div>或其他什么标签,绕过正则,而之后又会被清除掉。
而虽然clearxss会在onerror里加<x>,但我们又通过strip_tags清除了这个<x>。等于没加。
关于清除<x>这个事,大家可以做个试验。
这个代码会输出什么?我最后发现输出的是
前面一个<x>全部被清除了,而在img标签中的<x>最后留下了一个x。这就是二者的差别。所以我们不能直接输入<img src=# onerror=alert(1)>,这样我们最后输出的是<img src=# onxerror=alert(1)>,onerror中间多一个x,还是没法执行。
漏洞证明:
说了半天思路,我直接给payload吧:
将这个poc写在帖子里发出去,就能看到弹窗了:
再来个加载远程js的exp:
可以看到平台已经接收到cookie了:
最后说一下,Startbbs虽然不是大厂商,但自己在挖洞时的分析使我又学到了很多。依旧是老问题,富文本xss,很容易出现问题。而且这个位置也很重要,可能有些xss在用户资料或其他位置,但这个xss位置在发帖正文处,如果盲打的话危害很大。或许能够蠕动起来吧,谁知道呢~
修复方案:
使用urlencode将url进行编码以后放入img标签中。或者过滤双引号。
版权声明:转载请注明来源 phith0n@乌云
漏洞回应
厂商回应:
危害等级:无影响厂商忽略
忽略时间:2014-08-07 11:46
厂商回复:
最新状态:
暂无