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

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

缺陷编号:wooyun-2015-0145198

漏洞标题:【齐博b2b商务系统】前台多处存储型xss直打后台admin

相关厂商:齐博CMS

漏洞作者: Elliott

提交时间:2015-10-15 11:10

修复时间:2016-01-18 11:11

公开时间:2016-01-18 11:11

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

危害等级:高

自评Rank:15

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-10-15: 细节已通知厂商并且等待厂商处理中
2015-10-20: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航
2015-12-14: 细节向核心白帽子及相关领域专家公开
2015-12-24: 细节向普通白帽子公开
2016-01-03: 细节向实习白帽子公开
2016-01-18: 细节向公众公开

简要描述:

来一发.....

详细说明:

齐博官网下载第一栏的最新版b2b商务系统作测试。

QQ截图20151007160935.png


环境:win7+xampp php
以普通用户权限注册一个号 账号为test 目标取得后台admin权限(Cookies)
在会员中心右栏发表文章,文章发表栏任意~~

QQ截图20151007161205.png


填完数据后提交, burp抓包,改postdb[content]栏,如图

QQ截图20151007163415.png


提交。

漏洞证明:

因为默认文章需要后台审核后才能发布,用admin登陆后台审核文章。

QQ截图20151007162140.png


QQ截图20151007162438.png


QQ截图20151007163624.png


执行了脚本,得到有效cookie~~~
content内长度是够了。 看看代码问题在哪儿
\news\member\post.php 154-165行

$postdb[content] = get_outpic($postdb[content],$fid,$GetOutPic);
$postdb[content] = En_TruePath($postdb[content]);
$postdb[content] = preg_replace('/javascript/i','java script',$postdb[content]); //过滤js代码
$postdb[content] = preg_replace('/<iframe ([^<>]+)>/i','&lt;iframe \\1>',$postdb[content]); //过滤框架代码

foreach($postdb AS $key=>$value){
if($key=='content'){
continue; //为啥要continue
}
$postdb[$key]=filtrate($value);
}


foreach中看到key为content就放弃filtrate了,且上面的正则根没过滤一样=。=。看看filtrate()

function filtrate($msg){
//$msg = str_replace('&','&amp;',$msg);
//$msg = str_replace(' ','&nbsp;',$msg);
$msg = str_replace('"','&quot;',$msg);
$msg = str_replace("'",'&#39;',$msg);
$msg = str_replace("<","&lt;",$msg);
$msg = str_replace(">","&gt;",$msg);
$msg = str_replace("\t"," &nbsp; &nbsp;",$msg);
//$msg = str_replace("\r","",$msg);
$msg = str_replace(" "," &nbsp; ",$msg);
return $msg;
}


依然没过滤 '<' '>' 等危险代码,程序猿写一个吧~~~
xss2:
进入test用户的用户中心。

QQ截图20151007164834.png


写新信息 接受者为admin(默认后台用户名)

QQ截图20151007165528.png


填完,burp抓包,改postdb[content]栏 如图

QQ截图20151007170559.png


提交
用admin账号进入(建站默认admin用户拥有后台前台所有权限)

QQ截图20151007170211.png


有新消息,点击查看

QQ截图20151007170400.png


QQ截图20151007170647.png


有效admin cookie出来了。。。
content长度够长~~ 看代码
xss3:
直接上问题code
问题文件所在位置 \hy\bd_pics.php 5-33行

function ReplaceHtmlAndJs($document)
{
$document = trim($document);
if (strlen($document) <= 0)
{
return $document;
}
$search = array ("'<script[^>]*?>.*?</script>'si", // 去掉 javascript
"'<[\/\!]*?[^<>]*?>'si", // 去掉 HTML 标记
"'([\r\n])[\s]+'", // 去掉空白字符
"'&(quot|#34);'i", // 替换 HTML 实体
"'&(amp|#38);'i",
"'&(lt|#60);'i", //问题在这里
"'&(gt|#62);'i",
"'&(nbsp|#160);'i"
); // 作为 PHP 代码运行
$replace = array ("",
"",
"\\1",
"\"",
"&",
"<", //恢复了实体
">",
" "
);
return @preg_replace($search, $replace, $document);
}


这个函数写得挺纳闷,匹配 &lt;和&gt;然后替换成 实体 < > ...........这不是自己给自己设个套吗!!
看看哪里调用 ReplaceHtmlAndJs
在 hy\member\post_company.php 86-88看到

if(!$postdb[qy_regmoney]) showerr_post("请输入公司注册资本");
if(!$postdb[content]) showerr_post("详细商家介绍不能为空");
$postdb[content]=nl2br($postdb[content]);
if(!$postdb[qy_contact_tel]) showerr_post("指定联系人电话不能为空");
if(!$postdb[qy_contact]) showerr_post("指定联系人不能为空");
if(!$postdb[qy_contact_email]) showerr_post("指定联系人邮箱地址不能为空");
foreach($postdb as $key=>$val){//全部数据处理
$postdb[$key]=ReplaceHtmlAndJs($val); //多处参数惨遭xss
}
if(!ereg("^[-a-zA-Z0-9_\.]+\@([0-9A-Za-z][0-9A-Za-z-]+\.)+[A-Za-z]{2,5}$",$postdb[qy_contact_email])){
showerr_post('邮箱不符合规则');


我们来利用一下打后台。
以普通注册用户身份 test登陆 然后创建商铺如图

QQ截图20151008225932.png


随便填一下参数,我们的目标是打后台。提交后burp抓包,修改postdb[title]参数 如下图

QQ截图20151008230409.png


查看发布情况可以发现存在前台xss 如下图

QQ截图20151008230753.png


那么怎么打后台呢, 我们用admin进后台 黄页店铺->店铺管理 即可 如下图

QQ截图20151008230958.png


QQ截图20151008231105.png


打到有效admin cookie 且长度为限制~

修复方案:

xss2修复:
/member/pm.php 154-182

elseif($job=='send')
{
if($step==2)
{
$rsdb=$userDB->get_passport($touser,'name');
if(!$rsdb)
{
showerr("当前用户不存在");
}
if(!$title){
showerr("标题不能为空");
}
if(strlen($array[title])>100){
showerr("标题太长了!");
}
$array[touid]=$rsdb[uid];
$array[fromuid]=$lfjuid;
$array[fromer]=$lfjid;
$array[title]=filtrate($title);

//针对火狐浏览器做的处理
$postdb[content] = str_replace("=\\\"../$webdb[updir]/","=\\\"$webdb[www_url]/$webdb[updir]/",$postdb[content]);
$postdb[content] = preg_replace('/javascript/i','java script',$postdb[content]);
$postdb[content] = preg_replace('/<iframe ([^<>]+)>/i','&lt;iframe \\1>',$postdb[content]);
$array[content] = stripslashes($postdb[content]);
pm_msgbox($array);
refreshto("?job=list","发送成功",1);
}


正则形同虚设!

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


漏洞回应

厂商回应:

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

忽略时间:2016-01-18 11:11

厂商回复:

漏洞Rank:4 (WooYun评价)

最新状态:

暂无