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.0127.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 等级)