搭建DVMA靶场用以一些练习

813 字
4 分钟
搭建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 无防护」的源码差异。


访问方式#

  1. 浏览器打开:http://127.0.0.1:8888
  2. 用 admin / password 登录
  3. 左侧菜单选模块,左侧 “DVWA Security” 可切换难度级别
  4. 每个页面底部的 “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


端口与安全#

本机端口分配:

两点安全设计,都是刻意的:

  • 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

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Profile Image of the Author
LYH
LYH,安全方向的在校学生。方向集中在 Web 安全和密码学——Web 这边从 webshell 识别、文件包含到注入类题目都在练,密码学在啃 RSA 和格密码相关的内容,逆向和网络也有涉猎。日常工具链是 Mac + Docker。欢迎交流学习!
公告
欢迎来到我的博客!这里展示我的学习过程与结果。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
站点统计
文章
52
分类
20
标签
32
总字数
311,598
运行时长
0 天
最后活动
0 天前

文章目录