搭建DVMA靶场用以一些练习
介绍
DVWA(Damn Vulnerable Web Application)是一套故意写得很不安全的 PHP 网站, 专门用来在本地合法地练习 Web 漏洞挖掘与利用。
登录后共 18 个漏洞模块,覆盖常见 Web 漏洞类型:
- sqli / sqli_blind SQL 注入 / SQL 盲注
- xss_r / xss_s / xss_d 反射型 / 存储型 / DOM 型 XSS
- csrf 跨站请求伪造
- exec 命令执行
- fi 文件包含
- upload 文件上传
- brute 暴力破解
- authbypass 认证绕过
- weak_id 弱会话 ID
- open_redirect 开放重定向
- csp / javascript / captcha / cryptography / api
每个模块都有 low / medium / high / impossible 四档难度,方便对照学习 「有防护 vs 无防护」的源码差异。
访问方式
- 浏览器打开:http://127.0.0.1:8888
- 用 admin / password 登录
- 左侧菜单选模块,左侧 “DVWA Security” 可切换难度级别
- 每个页面底部的 “View Source” 可以看当前难度的源码
文件目录说明
compose.yml 容器编排文件:定义 web + db 两个服务 setup_dvwa.py 一键建库脚本(纯 Python 标准库,零依赖) dvwa.sh 日常管理脚本(启动/停止/重置/看日志)
为什么是两个容器
DVWA 官方 web 镜像(ghcr.io/digininja/dvwa)里只有 Apache + PHP, 本身不含数据库。
数据库是单独一个容器(mariadb:11.4),两个容器通过 Docker 内部网络互联:
- web 容器用环境变量 DB_SERVER=db 找到数据库(db 是服务名,Docker 自动解析)
- 数据库的用户名/密码/库名在 compose.yml 里写死为 dvwa / p@ssw0rd / dvwa
好处:数据库独立、可单独重置;web 镜像保持干净(只换业务代码就行)。
日常操作
脚本方式(推荐,已加执行权限): ./dvwa.sh up 启动靶场 ./dvwa.sh down 停止(保留数据,下次 up 接着用) ./dvwa.sh restart 重启 ./dvwa.sh status 查看状态 ./dvwa.sh logs 实时看日志 ./dvwa.sh setup 重建/初始化数据库 ./dvwa.sh reset 彻底重置(清空所有数据后重建) ./dvwa.sh shell 进 web 容器 ./dvwa.sh db 进数据库命令行
等价的原生命令: docker compose up -d docker compose down docker compose logs -f
端口与安全
本机端口分配:
- DVWA → http://127.0.0.1:8888 (占用 8888)
- CVE-2021-41773 → http://127.0.0.1:8080 (原有靶场,未受影响)
两点安全设计,都是刻意的:
- web 端口写成三段式 127.0.0.1:8888:80,只绑本机回环地址。 同一个局域网里的其他设备访问不到这个靶场。 (若写成 “8888:80”,macOS 的 Docker 会绑到 0.0.0.0,全内网都能访问)
- 数据库端口 3306 完全没有映射到宿主机,只在容器内部网络可见。
核对命令(应显示 127.0.0.1:8888->80/tcp): docker ps —filter name=dvwa —format ’{{.Names}}\t{{.Ports}}‘
常见问题
Q: 页面报 “Could not connect to the database”? A: 数据库还没就绪。等 10 秒再刷新;仍不行则看日志: docker compose logs db
Q: 登录后提示数据库没初始化 / 页面报错? A: 手动重建库:./dvwa.sh setup 或彻底重置:./dvwa.sh reset
Q: 把靶场玩坏了,想恢复初始状态? A: ./dvwa.sh reset
Q: 想换个端口? A: 改 compose.yml 里 ports 的 “127.0.0.1:8888:80”,改成想要的本机端口, 然后 ./dvwa.sh up
Q: 数据存在哪?删了容器还在吗? A: 存在 Docker 命名卷 dvwa_dvwa-db-data 里。docker compose down 不删数据, 只有 down -v(即 ./dvwa.sh reset)才会清空。
Q: 怎么彻底卸载?
A: docker compose down -v 之后,再 docker image rm ghcr.io/digininja/dvwa
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!