ECShop远程代码执行漏洞安全通告

发布时间 2018-09-04

漏洞编号和级别


CVE编号:无,危险级别:高危,CVSS分值:官方未评定


影响版本


ECShop 2.x、ECShop 3.x


漏洞概述


ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MySQL数据库构架开发的跨平台开源程序。该网店系统大量用于个人网店搭建。ECShop开发了独有的高效模板引擎(2.15以前版本使用smarty模板引擎),并结合了Dreamweaver的模板和库功能,使得编辑制作模板变得更简单。用户可根据自己的需求对ECShop进行定制和扩展。


该漏洞产生的根本原因在于ECShop系统的user.php文件中,display函数的模板变量可控,导致注入,配合注入可达到远程代码执行的效果。使得攻击者无需登录等操作,直接可以获得服务器的权限。攻击者可利用该漏洞直接获取到服务器的最高权限。该漏洞影响ECShop全系列版本,截至目前,官方尚未发布关于漏洞的消息及补丁,现阶段利用该漏洞实施批量化攻击的数量正呈上升趋势。


漏洞验证


漏洞的根源在user.php中,先看/user.php中的login操作,可以看到该处代码中的308行用于读取HTTP_REFERER传递的数据,然后将该数据被赋值给$back_act变量。



接着,$back_act变量被assign函数调用,assign函数用于将外部变量传递给模板函数,然后通过display函数将之显示在页面上。



在/include/cls_template.php文件中找到display函数,该函数中有一个insert_mod函数是关键。



insert_mod函数在1150行,该函数返回一个动态调用,根据PoC的细节,我们可以得知调用的函数名是insert_ads。



跟进insert_ads函数,该函数存在于/include/lib_insert.php文件中:



可以从PoC中发现,$arr['id']和$arr['num']这两个变量,都是外部可控的输入点,在构造攻击向量的过程中用于执行SQL语句。而在函数的最后,调用了fetch函数,该函数是代码执行中漏洞触发的点。


fetch函数中,存在eval,该函数就是最终漏洞执行的地方,在参数经过fetch_str函数的处理后,最终被执行。



首先根据提示安装好ECShop环境(2.7.3版本),然后复现该漏洞,通过Brup Suite抓包新增Referer字段以及Payload后,得到响应包,复现该漏洞,在响应页面成功打印出SQL语句。



然后利用SQL注入漏洞,来复现写入webshell的操作,首先攻击同样是修改Referer字段中的值,加入构造好的PoC,用SQL语句进行命令注入。可以看到最终在根目录下生成了webshell,webshell为1.php文件。



影响范围


国内暴露在公网的ECShop数量较大,需要高度重视。



修复建议


临时处理方式可以修改include/lib_insert.php文件中相关漏洞的代码,将$arr[id]和$arr[num]强制将数据转换成整型,$arr[id]和$arr[num]前加入intval限制。需要修改的地方为:



ECShop 3.6.0修复了以上漏洞,因此建议尽快更新至最新的3.6.0版本。


参考链接
http://ringk3y.com/2018/08/31/ecshop2-x%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C/