Docker 部署 DVWA 与 SSH 隧道#
日期:2026-07-28
前文:02_Docker与虚拟机与NAS
一、DVWA 是什么#
DVWA(Damn Vulnerable Web Application) 是一个故意设计得漏洞百出的 PHP/MySQL Web 应用,用于安全从业人员练习渗透测试。
内置漏洞类型(对应 CISP-PTE Web 维度 40 分)#
| 漏洞类型 |
攻击方法 |
CISP-PTE 覆盖 |
| SQL 注入 |
联合查询 / 报错注入 / 盲注 |
✅ |
| XSS |
反射型 / 存储型 / DOM 型 |
✅ |
| CSRF |
跨站请求伪造 |
✅ |
| 文件包含 |
LFI(本地文件包含)/ RFI(远程文件包含) |
✅ |
| 文件上传 |
前端绕过 / MIME 绕过 / 黑名单绕过 |
✅ |
| 命令注入 |
RCE(远程命令执行) |
✅ |
| 暴力破解 |
弱口令爆破 |
✅ |
| CAPTCHA 绕过 |
验证码逻辑漏洞 |
✅ |
安全等级#
Low → 无任何防护,学习漏洞原理
Medium → 有基础过滤(如 mysql_real_escape_string),但可绕过
High → 更强的防御,需要更高级的绕过技巧
Impossible → 理论上无法攻破(最佳实践级别的防御)
二、部署过程#
完整命令#
# 1. 拉取镜像(经中科大 Docker 镜像加速)
docker pull vulnerables/web-dvwa
# 2. 启动容器(仅监听本地 127.0.0.1,不暴露到公网)
docker run -d --name dvwa -p 127.0.0.1:8080:80 vulnerables/web-dvwa
参数解释#
| 参数 |
含义 |
docker pull |
从镜像仓库下载 DVWA 镜像到本地 |
docker run -d |
后台运行容器(-d = detached) |
--name dvwa |
给容器起名 dvwa,之后用这个名字操作容器 |
-p 127.0.0.1:8080:80 |
端口映射——宿主机 127.0.0.1 的 8080 端口 → 容器内的 80 端口 |
vulnerables/web-dvwa |
使用的镜像名 |
三、验证结果分析#
命令 1:docker ps(查看正在运行的容器)#
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
89beb5ef831d vulnerables/web-dvwa "/main.sh" 7 minutes ago Up 7 minutes 127.0.0.1:8080->80/tcp dvwa
| 字段 |
本机输出 |
含义 |
| CONTAINER ID |
89beb5ef831d |
容器的唯一标识(与镜像 ID 不同——镜像是模板,容器是运行实例) |
| IMAGE |
vulnerables/web-dvwa |
基于哪个镜像创建的 |
| COMMAND |
/main.sh |
容器启动时执行的脚本(DVWA 的入口) |
| CREATED |
7 minutes ago |
容器创建时间 |
| STATUS |
Up 7 minutes |
Up = 正在运行(Exited = 已停止) |
| PORTS |
127.0.0.1:8080→80/tcp |
端口映射——关键:只有 127.0.0.1,公网无法访问 |
| NAMES |
dvwa |
容器名称,之后用 docker stop dvwa 等控制它 |
命令 2:ss -tlnp | grep -E '22|8080'(查看端口监听状态)#
LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
| 行 |
监听地址 |
端口 |
含义 |
| 第 1 行 |
127.0.0.1 |
8080 |
DVWA 容器——只监听本地回环,外网无法访问 |
| 第 2 行 |
0.0.0.0 |
22 |
SSH 服务——监听所有网卡,任何 IP 都能连(但只允许密钥认证) |
| 第 3 行 |
[::] |
22 |
SSH 服务 IPv6 版 |
0.0.0.0 和 127.0.0.1 的区别#
0.0.0.0:22 → "谁来都行":公网 IP、内网 IP、127.0.0.1 都能访问 22 端口
SSH 需要这个——你从家里连服务器,走的就是公网 IP 的 22 端口
127.0.0.1:8080 → "只允许我自己":只有在本机(服务器自己)才能访问 8080
外部任何 IP 都连不上 8080——即使知道端口号也没用
DVWA 要的就是这个——靶机不能暴露给公网脚本小子
四、SSH 隧道:在保证安全的前提下让你访问靶机#
为什么需要隧道#
问题:
浏览器在你的 Windows 电脑上 → DVWA 在远程服务器上
但 DVWA 只监听 127.0.0.1 → 你的浏览器无法直接访问
解决:
SSH 隧道 = 在你的电脑和服务器之间挖一条加密通道
你把本地 8080 端口的请求,通过 SSH(22 端口)转发到服务器的 127.0.0.1:8080
结果:浏览器打开 127.0.0.1:8080,实际上访问的是服务器上的 DVWA
隧道命令#
ssh -L 8080:127.0.0.1:8080 mycvm
| 参数 |
含义 |
-L |
Local port forwarding(本地端口转发) |
8080 |
本地(Windows)监听的端口 |
127.0.0.1 |
目标 IP——这里指服务器自己的 127.0.0.1 |
8080 |
目标端口——DVWA 容器映射出来的端口 |
mycvm |
SSH 别名,指向你的云服务器 |
隧道工作原理#
┌─────────────────────────────────────────────────────┐
│ 你的 Windows 电脑 │
│ │
│ 浏览器 ──→ http://127.0.0.1:8080 │
│ │ │
│ ▼ │
│ SSH 客户端(ssh -L 8080:...) │
│ 把本地 8080 的请求通过 SSH 隧道转发 │
└────────────────┬────────────────────────────────────┘
│
│ SSH 隧道(走 22 端口,全程加密)
│
┌────────────────┴────────────────────────────────────┐
│ 云服务器 │
│ │
│ SSH 服务端 ──→ 转发到 127.0.0.1:8080 │
│ │ │
│ ▼ │
│ Docker 容器(DVWA:80) │
└─────────────────────────────────────────────────────┘
访问步骤#
1. 本地 PowerShell 跑:ssh -L 8080:127.0.0.1:8080 mycvm
→ 保持这个窗口开着(关了隧道就断了)
2. 本地浏览器打开:http://127.0.0.1:8080
→ 默认账号 admin / password
→ 进入后点击 "Create / Reset Database" 初始化
3. 隧道窗口 Ctrl+C → 隧道断开 → 浏览器访问不了 → 靶机关闭不影响安全
安全边界总结#
公网能访问的:
✅ 22 端口(SSH)——但只允许密钥认证,暴力破解无效
公网不能访问的:
❌ 8080 端口(DVWA)——127.0.0.1 绑定 + 安全组未开放
❌ 通过 22 端口的 SSH 隧道 → 需要先通过密钥认证才能建立隧道
结论:要访问 DVWA,必须同时满足:
1. 拥有你的私钥(id_ed25519)
2. 建立 SSH 隧道
缺少任何一个条件 → 靶机完全不可见
五、Docker 常用控制命令速查#
docker ps # 查看运行中的容器
docker stop dvwa # 停止 DVWA
docker start dvwa # 重新启动
docker rm dvwa # 删除容器
docker images # 查看本地所有镜像
docker system prune -a # 清理所有未使用的镜像/容器(省磁盘)
六、当前服务器状态#
一台云服务器:mycvm(154.8.147.160)
├── SSH(22 端口,密钥认证)
├── Docker Engine
│ ├── 镜像:vulnerables/web-dvwa
│ └── 容器:dvwa(127.0.0.1:8080,仅本机访问)
├── Docker 镜像加速:中科大 + DaoCloud
└── apt 源:腾讯云内网源
下一步:开始在 DVWA 上手动练习 SQL 注入(Low 等级)