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

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

缺陷编号:wooyun-2014-060037

漏洞标题:74CMS存储型XSS跨进后台可GetShell

相关厂商:74c,s.com

漏洞作者: xfkxfk

提交时间:2014-05-09 16:06

修复时间:2014-08-04 16:08

公开时间:2014-08-04 16:08

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

危害等级:中

自评Rank:15

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-05-09: 细节已通知厂商并且等待厂商处理中
2014-05-14: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2014-07-08: 细节向核心白帽子及相关领域专家公开
2014-07-18: 细节向普通白帽子公开
2014-07-28: 细节向实习白帽子公开
2014-08-04: 细节向公众公开

简要描述:

~~

详细说明:

1、先来看存储型XSS跨进后台
在申请链接处,文件/link/add_link.php

elseif ($act=="save")
{
$captcha=get_cache('captcha');
$postcaptcha = trim($_POST['postcaptcha']);
if($captcha['verify_link']=='1' && empty($postcaptcha))
{
showmsg("请填写验证码",1);
}
if ($captcha['verify_link']=='1' && strcasecmp($_SESSION['imageCaptcha_content'],$postcaptcha)!=0)
{
showmsg("验证码错误",1);
}
if ($_CFG['app_link']<>"1")
{
showmsg('已停止自助申请链接,请联系网站管理员!',1);
}
else
{
$setsqlarr['link_name']=trim($_POST['link_name'])?trim($_POST['link_name']):showmsg('您没有填写标题!',1);
$setsqlarr['link_url']=trim($_POST['link_url'])?trim($_POST['link_url']):showmsg('您没有填写链接地址!',1);
$setsqlarr['link_logo']=trim($_POST['link_logo']);
$setsqlarr['app_notes']=trim($_POST['app_notes']);
$setsqlarr['alias']=trim($_POST['alias']);
$setsqlarr['display']=2;
$setsqlarr['type_id']=2;
$link[0]['text'] = "返回网站首页";
$link[0]['href'] =$_CFG['site_dir'];
!inserttable(table('link'),$setsqlarr)?showmsg("添加失败!",0):showmsg("添加成功,请等待管理员审核!",2,$link);
}
}


对链接信息没有过滤直接进入数据库。
在后台显示时,文件/admin/admin_link.php
if($act == 'list')
{
get_token();
check_permissions($_SESSION['admin_purview'],"link_show");
require_once(QISHI_ROOT_PATH.'include/page.class.php');
$oederbysql=" order BY l.show_order DESC";
$key=isset($_GET['key'])?trim($_GET['key']):"";
$key_type=isset($_GET['key_type'])?intval($_GET['key_type']):"";
if ($key && $key_type>0)
{

if ($key_type===1)$wheresql=" WHERE l.link_name like '%{$key}%'";
elseif ($key_type===2)$wheresql=" WHERE l.link_url like '%{$key}%'";
}
else
{
!empty($_GET['alias'])? $wheresqlarr['l.alias']=trim($_GET['alias']):'';
!empty($_GET['type_id'])? $wheresqlarr['l.type_id']=intval($_GET['type_id']):'';
if (is_array($wheresqlarr)) $wheresql=wheresql($wheresqlarr);
}
if ($_CFG['subsite']=="1" && $_CFG['subsite_filter_links']=="1")
{
$wheresql.=empty($wheresql)?" WHERE ":" AND ";
$wheresql.=" (l.subsite_id=0 OR l.subsite_id=".intval($_CFG['subsite_id']).") ";
}
$joinsql=" LEFT JOIN ".table('link_category')." AS c ON l.alias=c.c_alias ";
$total_sql="SELECT COUNT(*) AS num FROM ".table('link')." AS l ".$joinsql.$wheresql;
$page = new page(array('total'=>$db->get_total($total_sql), 'perpage'=>$perpage));
$currenpage=$page->nowindex;
$offset=($currenpage-1)*$perpage;
$link = get_links($offset, $perpage,$joinsql.$wheresql.$oederbysql);
$smarty->assign('link',$link);
$smarty->assign('page',$page->show(3));
$smarty->assign('upfiles_dir',$upfiles_dir);
$smarty->assign('get_link_category',get_link_category());
$smarty->assign('navlabel',"list");
$smarty->display('link/admin_link.htm');
}
看看get_link函数:

function get_links($offset, $perpage, $get_sql= '')
{
global $db;
$row_arr = array();
$limit=" LIMIT ".$offset.','.$perpage;
$result = $db->query("SELECT l.*,c.categoryname FROM ".table('link')." AS l ".$get_sql.$limit);
while($row = $db->fetch_array($result))
{
$row_arr[] = $row;
}
return $row_arr;
}


直接取出显示,没有过滤,导致xss。
我们来申请链接:http://localhost/74cms/link/add_link.php

1.png


后台管理员查看申请链接时:http://localhost/74cms/admin/admin_index.php

2.png


2、后台GetShell
我们首先可以在前台上传一个头像jpg文件,文件内容:

<?php phpinfo();?>


上传后的文件路径为:
http://localhost/74cms/user/personal/personal_index.php
查看头像属性:

3.png


通过第一步拿到的cookie登陆后台。
后台工具——计划任务——添加任务:
任务脚本就填我们上传的头像图片路径:../../data/avatar/100/2014/05/09/1.jpg
然后提交即可。
此时在网站首页刷新页面,得到结果:

5.png


3、总结
通过上面的XSS和后台的GetShell
我们可以全部自动化,由于后台有csrf防御,我们可以先通过xss获取到后天的csrftoken,然后构造getshell的js文件,在来一次xss就搞定了。

漏洞证明:

见详细说明。

修复方案:

过滤啊

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


漏洞回应

厂商回应:

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

忽略时间:2014-08-04 16:08

厂商回复:

最新状态:

暂无


漏洞评价:

评论