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

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-069681

漏洞标题:Cmseasy存储型XSS一枚(绕过xss防护)

相关厂商:cmseasy

漏洞作者: zj1244

提交时间:2014-07-25 15:22

修复时间:2014-09-08 15:24

公开时间:2014-09-08 15:24

漏洞类型:xss跨站脚本攻击

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-07-25: 细节已通知厂商并且等待厂商处理中
2014-07-27: 厂商已经确认,细节仅向厂商公开
2014-08-06: 细节向核心白帽子及相关领域专家公开
2014-08-16: 细节向普通白帽子公开
2014-08-26: 细节向实习白帽子公开
2014-09-08: 细节向公众公开

简要描述:

不搞论坛了,换个姿势继续x,最新版也受到影响

详细说明:

存在xss的地方在商品评论的用户名处

1.jpg


直接给出xss语句,360脚本拦截html实体编码,所以需要使用\uxxxx编码。语句如下:

<input onfocus=onfocus=\u0061lert(1) autofocus>


漏洞的成因主要是因为正则没写好,并且碰巧用户名处没去除html标签导致的。我们一步一步看:
首先我们输入的数据会来到uploads\lib\default\comment_act.php的第8行:

function add_action() {
if(front::post('submit') &&front::post('aid')) {
if(config::get('verifycode')) {
if(front::post('verify')<>session::get('verify')) {
alertinfo('验证码错误。', front::$from);
//front::redirect(front::$from);
}
}
if(!front::post('username')) {
/*front::flash(lang('请留下你的名字!'));
front::redirect(front::$from);*/
alertinfo('请留下你的名字!', front::$from);
}
if(!front::post('content')) {
/*front::flash(lang('请填写评论内容!'));
front::redirect(front::$from);*/
alertinfo('请填写评论内容!', front::$from);
}
$this->manage->filter(); //********此处跟进filter
$comment=new comment();
$archive=new archive();
front::$post['state'] = '0';
front::$post['adddate']=date('Y-m-d H:i:s');
$comment->rec_insert(front::$post);
$archive->rec_update('comment=comment+1',front::post('aid'));
//front::flash(lang('提交成功!'));
alertinfo('评论提交成功。', front::$from);


跟进filter来到\uploads\lib\table\table_mode.php第9行:

function filter() {
foreach(front::$post as $key =>$value) {
if(is_string($value))
front::$post[$key]=tool::filterXss($Exc ?$value : tool::removehtml($value)); //******继续跟进removehtml
}
}


继续跟进removehtml,可以看到removehtml的定义如下:

static function removehtml($str) {
$farr=array(
"/<(\/?)(script|i?frame|style|html|body|title|link|meta|\?|\%)([^>]*?)>/isU",
"/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU",
);
$tarr=array(
"<\1\2\3>",
"\1\2",
);
$str=preg_replace($farr,$tarr,$str);
return $str;
}


其中存在问题的正则是

/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU


并且按照"\1\2"的分组来替换,如果我们输入的是

<input onfocus=onfocus=\u0061lert(1) autofocus>


看看会替换成什么样:

2.jpg

可以看到分组1和2刚好拼凑成了<input onfocus=\u0061lert(1) autofocus>
最后看输出,输出在#comment_js.php,可以看到content使用了strip_tags去掉html标签,而username却直接输出到页面。一系列的巧合导致了漏洞发生。

5.jpg


成功执行xss

3.jpg

漏洞证明:

成功执行xss

3.jpg

修复方案:

1、正则修改下
2、用strip_tags去掉html标签

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2014-07-27 11:28

厂商回复:

感谢,立即更新

最新状态:

暂无