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

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

缺陷编号:wooyun-2013-046585

漏洞标题:YXcms1.2.0版本 存储式XSS(实站演示+源码分析)

相关厂商:YXcms

漏洞作者: lxj616

提交时间:2013-12-26 15:57

修复时间:2014-03-26 15:58

公开时间:2014-03-26 15:58

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

危害等级:高

自评Rank:10

漏洞状态:未联系到厂商或者厂商积极忽略

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-12-26: 积极联系厂商并且等待厂商认领中,细节不对外公开
2014-03-26: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

YXcms 最新1.2.0版本 存储式XSS(实站演示)
源码分析请见详细说明,各种躺枪的演示在漏洞证明

详细说明:

题外话:之所以发这个漏洞,是因为
1.这个CMS的过滤比较强,不像之前某些CMS一丁点儿过滤都没有 完全没有挑战的价值
2.Stored-XSS 是跨站中危害比较大的漏洞,之前一直没找机会玩一玩跨站,再不发跨站的漏洞可能会被人认为不会挖XSS的洞洞
看代码
/protected/apps/default/controller/extendController.php line:40

session_starts(); //接收表单的地方
if($_POST['checkcode']!=$_SESSION['verify'] || empty($_SESSION['verify'])) $this->error('验证码错误,请重新输入');
//验证码无缺陷,扫描器不可能发现这个漏洞,继续看代码
for($i=1;$i<count($tableinfo);$i++){
//动态的表单支持
if(is_array($_POST[$tableinfo[$i]['tableinfo']]))
//先看后面的else
$data[$tableinfo[$i]['tableinfo']]=implode(',',$_POST[$tableinfo[$i]['tableinfo']]);
else
//正常提交表单会到这里,使用in函数来过滤参数,grep一下
$data[$tableinfo[$i]['tableinfo']]=in($_POST[$tableinfo[$i]['tableinfo']]);
}
$data['ip']=get_client_ip();
$data['ispass']=0;
$data['addtime']=time();
if(empty($urls[1])) $jump=$_SERVER['HTTP_REFERER'];
else{
$jurl=explode(',',$urls[1]);
if(!empty($jurl[1])){
$arr=explode('/',$jurl[1]);
if(!empty($arr)){
$canshu=array();
foreach ($arr as $vo) {
$val=explode('=',$vo);
$canshu[$val[0]]=$val[1];
}
}
}
$jump=url($jurl[0],$canshu);
}
//下面用的是in函数过滤完的post,看来只能去找in函数了
if(model('extend')->Extin($tableinfo[0]['tableinfo'],$data)) $this->success('提交成功请等待审核~',$jump);
else $this->error('提交失败~');


寻找in函数
/protected/include/lib/common.function.php line:8

function in($data,$force=false){
//完美的htmlspecialchars+addslashes
//看上去好像没希望了
//没错,我马上要说但是了,看看这个CMS是怎么输出的留言内容吧
if(is_string($data)){
$data=trim(htmlspecialchars($data));//防止被挂马,跨站攻击
if(($force==true)||(!get_magic_quotes_gpc())) {
$data = addslashes($data);//防止sql注入
}
return $data;
} else if(is_array($data)) {
foreach($data as $key=>$value){
$data[$key]=in($value,$force);
}
return $data;
} else {
return $data;
}
}


/protected/apps/default/view/default/extend_guestbook.php line:77
怎么感觉这么喜感,在一堆
$vo['tname'] $vo['addtime'] $vo['reply'] 中
出现了一个html_out($vo['content'])

<div class="book-list-info">留言者:{$vo['tname']}&nbsp;&nbsp;&nbsp;  IP:{$vo['ip']} &nbsp;&nbsp;&nbsp; 留言时间:{date($vo['addtime'],Y-m-d H:m:i)}</div>
<div class="book-list-con">{html_out($vo['content'])}</div>
<div class="book-list-back">{$vo['reply']}</div>


/protected/include/lib/common.function.php line:75

function html_out($str){
if(function_exists('htmlspecialchars_decode'))
$str=htmlspecialchars_decode($str);
//天哪!好不容易过滤掉的东西又回来了!!!
else
$str=html_entity_decode($str);
$str = stripslashes($str);
return $str;
}


留言content引发存储式XSS,证毕

漏洞证明:

经测试,那个表单是在留言处接受的
先在本机证明,再去光顾躺枪的网站:
表单位置:

http://127.0.0.1/index.php?r=default/extend/index&id=100023


001.png


然后改content

002.png


003.png


打cookie了,下面的cookie是躺枪的haohm网站的

004.png


为了方便测试,再发一个alert的图

005.png


006.png


007.png


躺枪光荣,我只是登了演示一下漏洞,啥都没干
http://www.haohm.net/

008.png


再躺一个,仍然只是验证漏洞,没有任何恶意

009.png


修复方案:

/protected/apps/default/view/default/extend_guestbook.php line:78

<div class="book-list-con">{html_out($vo['content'])}</div>


去掉html_out,后台显示也同理去掉html_out

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


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝