---
title: 【实战靶场】基于 Docker 快速搭建 MySQL 与 MSSQL 漏洞复现环境及 DataGrip 避坑指南
tags:
  - 网络安全
  - SQL注入
  - Docker
  - MySQL
  - MSSQL
categories:
  - Web安全
  - 靶场搭建
---

# 【实战靶场】基于 Docker 快速搭建 MySQL 与 MSSQL 漏洞复现环境及 DataGrip 避坑指南

在学习 Web 安全与 SQL 注入(SQLi)时,拥有一个快速部署、随用随删的数据库靶场环境至关重要。本文记录在 Windows 环境下,使用 **Docker** 快速搭建 **MySQL 5.7** 与 **MSSQL 2019 (SQL Server)** 测试环境的全流程,以及使用 **DataGrip** 连接时的常见避坑记录。

---

## 目录
1. [一、MySQL 靶场快速搭建与持久化挂载](#1)
2. [二、MSSQL 2019 靶场搭建与验证](#2)
3. [三、DataGrip 图形化连接与配置](#3)
4. [四、高频报错与踩坑总结(重点复盘)](#4)

---

<span id="1"></span>
## 一、MySQL 靶场快速搭建与持久化挂载

### 1. 准备初始化数据 (`init.sql`)
在本地新建工作目录(如 `C:\sqli-lab`),创建 `init.sql` 文件并写入测试数据:

```sql
CREATE DATABASE IF NOT EXISTS sqli_lab;
USE sqli_lab;

-- 创建用户表
CREATE TABLE IF NOT EXISTS users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50),
    password VARCHAR(50),
    email VARCHAR(100),
    role VARCHAR(20) DEFAULT 'user'
);

-- 插入测试数据
INSERT INTO users (username, password, email, role) VALUES
('admin',   'admin123', 'admin@lab.com',   'admin'),
('alice',   'alice456', 'alice@lab.com',   'user'),
('bob',     'bob789',   'bob@lab.com',     'user'),
('charlie', 'charlie0', 'charlie@lab.com', 'user'),
('root',    'root321',  'root@lab.com',    'admin');

-- 创建敏感密钥表(模拟 Flag)
CREATE TABLE IF NOT EXISTS secrets (
    id INT PRIMARY KEY,
    secret_key VARCHAR(100)
);

INSERT INTO secrets VALUES 
(1, 'FLAG{sqli_is_fun}'),
(2, 'FLAG{never_trust_user_input}');

2. Docker 启动并挂载自动执行

利用 MySQL 官方镜像特性,将 SQL 文件挂载至 /docker-entrypoint-initdb.d/ 目录,容器初次启动时会自动执行建库建表:

PowerShell

# PowerShell 环境
docker run -d `
  --name mysql-lab `
  -p 3306:3306 `
  -e MYSQL_ROOT_PASSWORD=root `
  -v ${PWD}/init.sql:/docker-entrypoint-initdb.d/init.sql `
  mysql:5.7

3. 数据验证

PowerShell

docker exec -it mysql-lab mysql -uroot -proot -e "USE sqli_lab; SELECT * FROM secrets;"

二、MSSQL 2019 靶场搭建与验证

1. 启动 MSSQL 容器

⚠️ 密码策略提醒: MSSQL 对管理员 sa 密码有强制复杂度要求(至少 8 位,包含大小写字母、数字和特殊字符)。

PowerShell

docker run -d `
  --name mssql-lab `
  -e "ACCEPT_EULA=Y" `
  -e "SA_PASSWORD=YourStrong@Passw0rd" `
  -p 1433:1433 `
  [mcr.microsoft.com/mssql/server:2019-latest](https://mcr.microsoft.com/mssql/server:2019-latest)

2. 命令行快速初始化数据

在新版 MSSQL 容器中,sqlcmd 工具位于 /opt/mssql-tools18/bin/sqlcmd(需加 -C 参数信任自签名证书):

PowerShell

docker exec -it mssql-lab /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Passw0rd' -C -Q "
CREATE DATABASE sqli_lab;
GO
USE sqli_lab;
GO
CREATE TABLE users (
    id INT PRIMARY KEY IDENTITY(1,1),
    username NVARCHAR(50),
    password NVARCHAR(50),
    role NVARCHAR(20) DEFAULT 'user'
);
CREATE TABLE secrets (
    id INT PRIMARY KEY,
    secret_key NVARCHAR(100)
);
INSERT INTO secrets VALUES (1, N'FLAG{mssql_is_powerful}');
"

三、DataGrip 图形化连接与配置

1. 连接 MySQL

  • Host: localhost

  • Port: 3306

  • User: root

  • Password: root

  • Database: sqli_lab

2. 连接 MSSQL (SQL Server)

  • Host: localhost

  • Port: 1433

  • User: sa

  • Password: YourStrong@Passw0rd

  • Database: sqli_lab

  • ⚠️ 核心避坑(SSL 证书): 切换到 Advanced (高级) 标签页,将 trustServerCertificate 改为 true,否则测试连接会因自签名证书校验失败而报错。

四、高频报错与踩坑总结(重点复盘)

坑点 1:bind: Only one usage of each socket address is normally permitted

  • 原因: 本机已运行了本地 MySQL,导致 3306 端口被占用。

  • 解决办法:

    • 方案 A:更改宿主机映射端口为 3307-p 3307:3306

    • 方案 B:使用 netstat -ano | findstr :3306 查出占用进程的 PID 并终止。

坑点 2:挂载了 init.sql 但数据库依然为空

  • 原因: 容器如果不是“初次创建”或数据卷已存在残留,不会重新触发 /docker-entrypoint-initdb.d/ 脚本。

  • 解决办法: 先彻底删除旧容器:docker rm -f mysql-lab,然后再重新运行启动命令。

坑点 3:MSSQL 执行报错 Could not find stored procedure 'GO'

  • 原因: GO 是终端工具(如 sqlcmd)的批处理分隔符,并非标准 SQL 语法。在 DataGrip / DBeaver 等图形化工具中,直接写 SQL 语句并以分号 ; 结尾即可,不需要输入 GO

总结

通过 Docker 容器化方案,我们可以分钟级拉起隔离、干净的漏洞测试环境。结合 DataGrip 的智能补全与语法检查,能大幅提升 SQL 注入练习和脚本编写的效率。

更多推荐