ecshop 解密index.php,ECShop 2.x 3.0代码执行漏洞分析

0x00 前言

ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店。2.x版本跟3.0版本存在代码执行漏洞。

0x01 漏洞原理

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

0x02 环境搭建

IDE : PHPStorm

PHP: 5.4

ECshop3.0

ECShop 2.7.3

0x03 分析过程

整体功能

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

00eaa7d4151c3062bec91ae16b977b5e.png

正常情况下,程序会将$GLOBALS[‘_SERVER’][‘HTTP_REFERER’] 赋值给了$back_act,接着通过cls_template模板类的assign和display进行赋值和和传值给了user_passport.dwt页面模板;这时候user_passport.dwt页面模板的内容是这样子的。

ba9d9097c3b6f408ca24aa9c149bab77.png

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

user_passport.dw模板:

cd32d4ed7cf9c4c5a96b1d666505828f.png

inser_mod函数:

a1e91b372f00aa143c93c5a599cc1f3d.png

Payload

开始分析

在user.php 中的通过执行登陆操作的时候,将$GLOBALS[‘_SERVER’][‘HTTP_REFERER’]的值修改为我们的代码

68ba95cc20b2c08139c608227bab810f.png

这时候$back_act的值就是我们篡改之后的REFERER值了,之后程序会继续执行:

经过assign,display的赋值和传值之后,这时候user_passport.dwt模板上的back_act值是这样的:

868b1ace84c05d4a73640bd48ea1ab44.png

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

ef14b5a2fa855f7224b9f35b975722ac.png

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

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

771389de8773858aa92e65a3fec447cc.png

分割完之后程序会先执行两个默认函数,然后才执行我们的代码,继续执行insert_mod函数 。

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

628b2657bca0caf324605dbe2a74dea0.png

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

06c00abd8951998a4f44f419884b7fce.png

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

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

ac15950d7dbd1a41d614b88cd0dcdc21.png

这时候在数据库中,执行的语句为:

adf471d608f0d0349117ece38ba497bd.png

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

bf18ad11195a668233c48b30d41d0504.png

查询结束之后,根据$position_style的值执行了cls_template模板类的fetch函数。

跟进,看到这里,这里最终执行了恶意代码。

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

然后使用substr对filenname进行切割,接着进入到$this->fetch_str中,可以看到fetch_str函数的返回内容为<?php echo xx>格式的。

64582fc8fcfeaf50fb406b1f7f7b8838.png

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

2adc755e6610314d7aa86287466449a7.png

字符串处理最后返回的值为:

拼接在一起,最后返回的数据为:

从而最终导致了代码执行。

01e01a644657611969b9f14548d3d69c.png

0x04 代码执行的调用链

0a5fcd29d5ea02dc079fd6e9ce09138d.png

0x05 修复方案

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

作者:斗象能力中心TCC-t-bag

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通达OA2010版本,完整general目录下php文件无加密,示例: <?php /*********************/ /* */ /* Version : 5.1.0 */ /* Author : RM */ /* Comment : 071223 */ /* */ /*********************/ include_once( "inc/auth.php" ); if ( $LOGIN_THEME != "10" ) { $query = "SELECT * from INTERFACE"; $cursor = exequery( $connection, $query ); if ( $ROW = mysql_fetch_array( $cursor ) ) { $IE_TITLE = $ROW['IE_TITLE']; } echo "<html>\r\n<head>\r\n<title>"; echo $IE_TITLE; echo "</title>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\">\r\n[removed][removed]\r\n[removed]\r\nself.moveTo(0,0);\r\nself.resizeTo(screen.availWidth,screen.availHeight);\r\nself.focus();\r\n\r\nrelogin=0;\r\nfunction exit()\r\n{\r\n if(document.body.clientWidth-event.clientX<50||event.altKey||event.ctrlKey)\r\n {\r\n"; if ( $ISPIRIT == 1 ) { echo "return;"; } echo " var req = new_req();\r\n\treq.open(\"GET\", \"relogin.php\", true);\r\n\treq.send('');\r\n }\r\n}\r\n\r\n[removed]\r\n</head>\r\n"; include_once( "inc/antivirus.txt" ); echo "<frameset rows=\"50,*,20\" cols=\"*\" frameborder=\"no\" border=\"0\" framespacing=\"0\" id=\"frame1\" <frame name=\"banner\" id=\"banner\" scrolling=\"no\" noresize=\"noresize\" src=\"topbar.php\" frameborder=\"0\">\r\n <frameset rows=\"*\" cols=\"200,*\" frameborder=\"no\" border=\"0\" framespacing=\"0\" id=\"frame2\">\r\n <frame name=\"leftmenu\" id=\"leftmenu\" scrolling=\"no\" noresize=\"noresize\" src=\"ipanel\" frameborder=\"0\">\r\n <frame name=\"table_index\" id=\"table_index\" scrolling=\"no\" src=\"table.php\" frameborder=\"0\">\r\n </frameset>\r\n <frame name=\"status_bar\" id=\"status_bar\" scrolling=\"no\" noresize=\"noresize\" src=\"status_bar\" frameborder=\"0\">\r\n</frameset>\r\n</html>\r\n"; exit( ); } include_once( "inc/utility_all.php" ); include_once( "inc/td_core.php" ); include_once( "inc/chinese_date.php" ); include_once( "inc/sys_function_all.php" ); ob_end_clean( ); 本资源(仅供技术学习,版权归原公司所有)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值