很多初学者刚接触网络安全时,都卡在同一个地方:看过大量漏洞原理,知道 XSS 是什么、SQL 注入怎么写,但一到实操就找不到一个合法、安全、可反复折腾的“试验场”。去公网测试别人的网站是违法的,在本机随便写个漏洞代码又不够真实,半天调不出效果。这个阶段需要的,正是一个能装在自己电脑里、可以随意“破坏”、坏了大不了重装的 Web 漏洞靶场。
DVWA 就是这类工具中最经典的一个。它全称 Damn Vulnerable Web Application,翻译过来是“该死的易受攻击 Web 应用”。名字很直白,目的就是故意把常见 Web 漏洞暴露给你,让你在受控环境里练习发现、利用和防御漏洞。这篇文章不会只丢给你一段下载链接就结束,而是从环境选型、手动部署、Docker 快速搭建,到数据库初始化和常见报错排查,把整套流程拆开讲清楚。读完你不仅能跑起来 DVWA,还能理解每一步背后的原因。
先说结论:在 2026 年的技术语境下,学习 Web 安全仍然建议从 DVWA 起步,但环境搭建方式要升级。手动部署仍然值得做一遍,因为它能帮你理解 Web 应用的目录结构、配置文件和 PHP 运行环境;日常练习则推荐用 Docker,省时省力,还能随时销毁重建。接下来,我们按照“先理解、再准备、后实操、最后排错”的顺序,把 DVWA 安装这件事做到保姆级详细。
1. DVWA 是什么,为什么要用它练手
1.1 网络靶场的价值
网络安全学习有个天然矛盾:真实业务系统不允许你随便尝试漏洞,因为你不知道哪一步会触发不可逆破坏;但如果只用抽象代码片段学习,又完全体会不到漏洞在完整应用中的利用路径。网络靶场(Cyber Range)就是为解决这个矛盾而生的。它的本质是一个故意包含漏洞的模拟目标,让学习者在合法、隔离、可恢复的环境中进行渗透测试、漏洞验证和防御加固。
DVWA 不是唯一的靶场,Pikachu、WebGoat、upload-labs、vulnhub 系列都各有特色。但 DVWA 有自己独特的位置:它足够小,几分钟就能跑起来;又足够全面,几乎覆盖了 OWASP Top 10 里的主要 Web 漏洞,适合作为 Web 安全入门第一站。
1.2 DVWA 的核心特点
DVWA 基于 PHP + MySQL 构建,界面是老式 Web 应用的风格,但这恰恰是它的优势。你看到的不是前后端分离的现代工程,而是最直接的服务端渲染页面,每个漏洞点都很容易对应到代码逻辑,对理解原理极其友好。
它的核心特点有三个:
第一是安全级别可调。DVWA 内置 Low、Medium、High、Impossible 四个安全级别。同一个漏洞点,在 Low 级别下几乎是“裸奔”的,方便你看清漏洞成因;切换到 High 或 Impossible 后,又能看到代码层面怎样通过过滤、参数化查询等方式进行防御。这种“对比式”学习是 DVWA 最值钱的地方。
第二是模块丰富。它包含暴力破解、命令注入、CSRF、文件包含、文件上传、SQL 注入、XSS(反射型、存储型、DOM 型)、不安全的验证码、弱会话 ID 等常见漏洞模块。每个模块都有源代码查看功能,你可以一边攻击一边读代码,理解“为什么这里能打进去”。
第三是社区活跃,资料多。无论你卡在哪个模块,都能搜到大量通关教程。问题是通关教程很多,安装教程却经常写得很简略,尤其是环境变化后旧教程失效,这是本文想补齐的部分。
1.3 哪些人最应该装 DVWA
如果你属于以下情况之一,建议尽快装一个:
- 正在学网络安全课程,需要把理论转化为实操;
- 准备参加 CTF 比赛或网络安全竞赛,需要一个基础训练环境;
- 从事 Web 开发,想理解攻击者视角,写出更安全的代码;
- 准备转行安全测试,面试前需要快速熟悉常见漏洞利用方法。
安装 DVWA 的门槛不高,不需要高配电脑。一台普通的 Windows 或 Linux 电脑,能跑浏览器、能装 PHP 环境就可以了。关键是你愿意花一晚上把环境调通,之后就进入“随便折腾”模式了。
2. 安装前的准备:环境选型和版本理解
2.1 操作系统与运行环境
DVWA 是 PHP 项目,依赖 MySQL/MariaDB 数据库。你的操作系统可以是 Windows、Linux 或者 macOS。最常见的练习环境有两种:
- 直接在物理机或虚拟机里部署 Windows + PHP 集成环境;
- 在 Kali Linux 或 Ubuntu 里用 Docker 部署。
这里要提醒一个容易踩的坑:DVWA 旧版本基于 PHP 5.x 开发,新版本已经兼容 PHP 7.x 和 PHP 8.x。如果你用的是古老版本的 DVWA,配太新的 PHP 可能报兼容性错误;反过来,太老的 PHP 也可能无法运行新版 DVWA。因此,不建议去网上随意下载来源不明的“一键安装版”,优先从官方 GitHub 仓库获取源码,并选择与你 PHP 环境匹配的版本。
2.2 是否一定需要集成环境
新手在 Windows 上最常用的方案是 phpStudy 或 XAMPP。这两个工具都集成了 Apache/Nginx、PHP 和 MySQL,省去了单独配置各个组件的麻烦。对只想快速跑通 DVWA 的人来说,xampp 或 phpStudy 选一个即可,不需要同时装两个。
如果你对 Docker 比较熟悉,可以直接跳过集成环境。Docker 的隔离特性尤其适合安全靶场:容器里随便怎么折腾,随时可以一键重建,不影响宿主机。
2.3 版本选择策略
安全练习讲究“可复现”,所以建议固定一个已知稳定的组合。比如:
- 使用官方最新 master 分支的 DVWA;
- 配合 PHP 7.4 / 8.x 的集成环境;
- MySQL 使用 5.7 或 8.x,MariaDB 也可。
不要追求“最新版就一定最好”。DVWA 这种教学靶场,重点是模块完整、能跑通,而不是版本越新越好。如果你的集成环境已经内置了 PHP 和 MySQL,优先用它自带版本,减少额外配置。
2.4 网络环境与下载方式
DVWA 源码可以从 GitHub 官方仓库获取,一般通过git clone或下载 ZIP 包。如果在某些网络环境下访问 GitHub 较慢,可以使用镜像加速或代理工具,但这里不展开讨论,请你根据自身网络条件选择合法合适的下载途径。
后面会分别给出手动部署和 Docker 部署的完整命令。你不需要全做,选择一条路径滑到底即可。
3. 方式一:Windows 环境手动部署 DVWA
手动部署的价值在于“把每一块组件都装明白”。当你遇到问题时,能更快定位是 Web 服务器、PHP、MySQL 还是 DVWA 配置的问题。
3.1 下载 DVWA 源码
先获取源码。打开 DVWA 的 GitHub 仓库页面,下载 ZIP 包,或者用 Git 命令拉取:
git clone https://github.com/digininja/DVWA.git下载完成后,你会得到一个DVWA文件夹。里面的目录结构大致如下:
DVWA/ ├── config/ │ └── config.inc.php.dist ├── dvwa/ ├── external/ ├── hackable/ ├── phpinfo.php ├── README.md └── index.phpconfig目录下有一个config.inc.php.dist文件,这是配置文件模板。后面我们需要复制一份,改成config.inc.php,并填写数据库连接信息。
3.2 将 DVWA 放到 Web 目录
如果你使用 phpStudy,Web 根目录一般是phpstudy_pro\WWW;如果使用 XAMPP,一般是xampp\htdocs。把解压后的 DVWA 文件夹整体拷贝到这个目录下。
例如 XAMPP 环境下:
C:\xampp\htdocs\DVWA注意文件夹名称。虽然大小写不敏感,但为了保险,建议保持为DVWA,这样访问地址就是http://127.0.0.1/DVWA/,不容易出错。
3.3 修改配置文件
进入DVWA\config目录,找到config.inc.php.dist,复制一份并重命名为config.inc.php。
用文本编辑器打开config.inc.php,找到数据库配置部分:
# 文件路径:DVWA/config/config.inc.php $_DVWA = array(); $_DVWA[ 'db_server' ] = '127.0.0.1'; $_DVWA[ 'db_database' ] = 'dvwa'; $_DVWA[ 'db_user' ] = 'root'; $_DVWA[ 'db_password' ] = 'p@ssw0rd'; $_DVWA[ 'db_port' ] = '3306';这里需要改成你的 MySQL 实际账号密码。默认数据库用户root一般没问题,密码则要填你自己设置好的。
如果你的 MySQL 设置了非默认端口,还要同步修改db_port。修改后保存文件。
这个步骤很关键。很多人第一次安装 DVWA,卡在“Database Error: Connection refused”或者“Access denied for user”,十有八九是这里填错了,或者 MySQL 服务没启动。
3.4 启动 Web 服务和数据库
在 phpStudy 或 XAMPP 控制面板中,分别启动 Apache 和 MySQL。确认端口没有被占用,一般 Apache 是 80 端口,MySQL 是 3306 端口。
如果 Apache 启动失败,最常见原因是 80 端口被其他程序占用,例如 IIS、Nginx 或其他本地服务。解决方法是修改 Apache 的监听端口,或者关闭冲突服务。在 XAMPP 里可以打开配置文件,把Listen 80改成Listen 8080等,之后访问地址也要跟着变。
3.5 浏览器初始化安装
打开浏览器,访问:
http://127.0.0.1/DVWA/第一次访问会看到 DVWA 的欢迎页。点击页面下方的 “Create / Reset Database” 按钮,DVWA 会自动创建数据库并写入初始化数据。成功后页面会提示 Setup successful,并自动跳转到登录页。
默认用户名是admin,默认密码是password。登录后,你需要手动把安全级别调到你想要的档位。建议先保持 Low,等熟悉漏洞原理后再往 High 和 Impossible 调整。
到这里,手动部署方式就已经跑通了。
4. 方式二:Docker 快速部署 DVWA
如果你不想在物理机里装一堆运行环境,或者想随时切换版本、快速重置环境,Docker 是更好的选择。
4.1 安装 Docker
Docker 的安装在 Windows、macOS、Linux 上有不同方式。Windows 一般使用 Docker Desktop,安装后要确保 Docker 引擎能正常运行。Linux 下安装 Docker Engine 后,可以用docker version验证安装。
安装 Docker 后,强烈建议顺手安装 Docker Compose,因为 DVWA 官方提供了compose.yml,一条命令就能把 Web 和 MySQL 服务一起拉起来。
4.2 通过 Docker 命令运行 DVWA
最简单的方式是直接拉取官方镜像并运行:
docker run -d -p 8080:80 --name dvwa vulnerables/web-dvwa-p 8080:80表示把容器的 80 端口映射到本机的 8080 端口。这样访问地址是http://127.0.0.1:8080/,可以避免和本机已有的 Web 服务冲突。
启动后,容器里的 MySQL 可能正在初始化,第一次需要稍等片刻。你可以查看容器日志:
docker logs -f dvwa看到类似Apache started或数据库初始化完成的日志后,再访问页面。
4.3 使用 Docker Compose 管理更规范
如果使用官方仓库中的compose.yml,进入 DVWA 源码目录后执行:
docker compose up -d这种方式会同时启动 dvwa 和 db 两个服务,配置更清晰。停止服务用:
docker compose down重置整个靶场环境时,可以加-v参数删除数据卷:
docker compose down -v注意:down -v会把数据库数据一起删掉,相当于恢复出厂状态,这是练习后重置环境的常用操作。如果你希望保留通关状态,不要加-v。
4.4 Docker 方式的注意事项
使用 Docker 时要注意,容器里跑的 MySQL 默认 root 密码和主机无关。一般官方镜像默认的数据库配置在说明文档里都有,你不需要额外修改。如果登录时报数据库连接错误,先检查容器是否健康运行:
docker ps然后再看 dvwa 容器是否能正常访问数据库。最简单的验证方式是访问首页,如果数据库初始化失败,页面会直接显示红色报错信息。
Docker 方式的优势是干净、快速,适合反复练习;劣势是文件路径和底层系统被隐藏了,遇到复杂问题时,排查难度会大一些。建议两种方式都试一次:第一次手动安装理解架构,第二次 Docker 提升效率。
5. 验证安装是否成功
无论用哪种方式安装,跑通之后的验证步骤是一样的。
5.1 访问初始页面
手动部署时访问http://127.0.0.1/DVWA/,Docker 方式访问http://127.0.0.1:8080/。第一次访问会看到安装提示页面,没有红色错误就说明 PHP 和数据库基本正常。
如果页面出现 PHP 警告,比如时区相关的错误,通常不影响使用,但最好在php.ini里设置date.timezone,避免后面审计功能异常。
5.2 创建数据库并登录
点击 “Create / Reset Database” 后,页面会自动跳转到登录页。登录后进入 DVWA 主界面。
左侧菜单从上到下就是各个漏洞模块。你还可以在菜单中找到 “DVWA Security”,这里可以切换安全级别。初始状态可能是impossible或disabled,这取决于镜像版本。建议先切到low,方便观察最原始的漏洞利用过程。
5.3 用一个模块跑通测试
以 SQL Injection 模块为例,验证你确实能完成一次真实的漏洞利用。
进入 SQL Injection 页面,输入框提示输入 User ID。在 Low 级别下,输入:
1' OR '1'='1点击 Submit,如果页面返回所有用户信息,说明 SQL 注入漏洞成功触发,DVWA 环境完全正常。这个操作会造成数据库查询条件被改写,本质上是把原来的条件式查询变成了恒真条件,从而返回全部数据。
整个操作一定要用本地靶场数据,这是合法的安全练习,不能拿去对真实网站测试。
6. 常见问题与排查方法
安装 DVWA 会遇到的问题并不复杂,但有固定的高频套路。下面按现象整理成表格,方便你快速定位。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 访问页面提示数据库连接失败 | MySQL 未启动或端口不对 | 检查 MySQL 服务状态、db_port配置 | 启动 MySQL,修改配置文件并保存 |
| 登录报 Access denied for user | config.inc.php 中数据库账号密码错误 | 查看 MySQL 实际账号密码 | 使用正确账号密码,或重置 MySQL 密码 |
| 页面提示 404 Not Found | DVWA 文件没放到 Web 根目录下 | 检查 URL 和文件路径 | 访问http://127.0.0.1/DVWA/,确保目录名正确 |
| Apache 无法启动,提示端口被占用 | 80 端口被其他程序占用 | 命令行执行netstat -ano查看占用 | 关闭占用程序,或修改 Apache 端口 |
| PHP 版本兼容性警告 | DVWA 版本与 PHP 版本不匹配 | 查看页面警告提示 | 更换 DVWA 版本或调整 PHP 版本 |
| 初始化数据库后登录自动退出 | session 配置问题 | 查看浏览器控制台的 cookie | 清理浏览器 Cookie,重新登录 |
| Docker 运行后无法访问 | 容器未启动或端口映射错误 | 执行docker ps查看容器状态 | 用docker logs查看日志,检查端口映射 |
| 页面大量 PHP 警告或空白 | PHP 扩展缺失或权限不足 | 查看php.ini是否开启 mysqli 扩展 | 开启所需扩展,检查文件目录写权限 |
这里的多数问题,本质都是“环境不一致”造成的。所以安装前最好先记录自己的 PHP 版本、MySQL 版本和 DVWA 版本,遇到问题发到社区时,别人也能更快帮你判断。
6.1 数据库初始化失败的深度排查
如果点击 “Create / Reset Database” 后一直停在错误页面,先看数据库是否已经创建成功。可以用 MySQL 客户端连接数据库,执行:
SHOW DATABASES;如果能看到dvwa数据库,说明数据库创建成功,问题多半出在表结构或后续初始化 SQL 上。此时可以查看 Apache 的 error.log,通常位于集成环境的 logs 目录。
如果dvwa数据库不存在,说明 PHP 连接 MySQL 这一步就有问题。重点检查config.inc.php中的db_user和db_password是否与 MySQL 一致,以及 PHP 是否启用了 mysqli 扩展。
6.2 登录后页面样式丢失
这个问题在新手安装时也很常见。DVWA 依赖hackable目录下的资源文件和可写权限。在某些 Linux 环境或 Docker 挂载目录下,hackable/uploads目录可能没有写权限,导致文件上传或验证码功能异常。
解决方法是给相关目录加上合适的写权限。在 Linux 下,可以执行:
chmod -R 755 DVWA/hackable/uploads但要注意,给目录 777 权限是高风险操作,只在本地靶场环境使用。生产环境中绝对不要这么做。
7. 最佳实践与工程建议
7.1 把 DVWA 当作“本地隔离环境”
DVWA 是一个故意存在高危漏洞的应用,它不能被当作普通软件暴露到公网。正确用法是:
- 只在本地回调地址
127.0.0.1或虚拟机 NAT 网络中访问; - 不要把它部署到云服务器或真实业务服务器上;
- 练习结束后,及时停止 Web 服务和容器。
很多初学者图方便,在公网 VPS 上装 DVWA 做测试,这等于把一台充满漏洞的“靶机”主动暴露给攻击者,风险极高。安全学习的底线,是永远不在未授权环境执行漏洞测试。
7.2 使用虚拟机或容器做快照
安装完一套可用的 DVWA 后,建议立即做快照。无论是 VMware 虚拟机快照,还是 Docker 镜像导出,都会在你后续“玩坏”环境时帮你快速恢复。
对于 Docker 用户,一条命令导出镜像:
docker commit dvwa dvwa-backup之后随时可以基于备份镜像启动一个新的干净环境。
7.3 先阅读源码,再动手攻击
DVWA 每个模块都提供了查看源码的按钮。建议养成一个习惯:先看源码,预测漏洞点,再实际攻击。比如 SQL Injection 模块的源码里直接拼接了用户输入,你一眼就能看出注入点在哪里;而 High 级别使用了输入转义或参数化查询,你再攻击时就会明显感觉到难度上升。
这种“源码对照 + 攻击验证”的方法,比单纯看通关教程更能训练漏洞思维。
7.4 结合数据库管理工具观察数据变化
DVWA 底层是 MySQL 数据库。练习 SQL 注入时,如果同时打开 Navicat 或 MySQL 命令行,观察数据库里的数据变化,理解会更深入。比如输入1' OR '1'='1后,你会发现返回的数据是完整的 user 表,而不是单条记录,这就是“逻辑漏洞导致数据越权”的直观体现。
7.5 不要止步于“通关”
很多人把 DVWA 当成通关游戏,Low、Medium、High 挨个打通就完事,但这样成长有限。真正有价值的是理解防御原理:为什么 Low 级能打进去?代码应该怎么改才能防御?改成参数化查询后还能不能注入?这些问题的答案,才是安全工程师的核心能力。
如果你想继续深入,可以在 DVWA 之后尝试 Pikachu、WebGoat、upload-labs 和 vulnhub 系列靶机。不同靶场侧重点不同:Pikachu 更贴近中文教学场景,upload-labs 专注于文件上传漏洞,vulnhub 则是完整虚拟机的渗透测试实战。
8. 总结与后续学习方向
DVWA 安装的核心,其实就是“准备 PHP 环境 + 拿到源码 + 配置数据库 + 初始化”。手动部署适合理解底层结构,Docker 部署适合高效练习。两者不冲突,建议都跑一遍。
当你第一次在本地靶场成功触发 SQL 注入或存储型 XSS 的时候,那种“原来漏洞是这样打进去”的感觉,是看书看不出来的。这种体验会让你对 Web 安全产生真正的兴趣,也会让你在以后写代码时多一分敬畏:每一条用户输入,都可能是攻击入口。
下一步,你可以从 DVWA 的 SQL Injection 和 XSS 两个模块开始,尝试逐级别通关。过程中配合源码阅读,记录每个漏洞的利用条件和防御方法。熟练之后,再去挑战更接近真实业务场景的 Pikachu 或 upload-labs。
最后再强调一次安全边界:DVWA 这类靶场存在的意义,是让你在合法、受控的环境中练习安全测试。请把它留在自己的电脑里,不要带入任何未授权的系统。技术学习要有热情,更要有底线。