这次我们来看一个网络安全领域非常经典的靶场项目——DVWA。如果你正在学习Web安全,或者想找一个能本地搭建、包含多种真实漏洞的练习环境,DVWA绝对是绕不开的起点。它把SQL注入、XSS、文件上传、命令执行等常见漏洞集成在一个Web应用里,让你能在安全可控的环境下动手实践,理解漏洞原理和防御方法。
网上关于DVWA的教程很多,但要么步骤不全,要么环境依赖没讲清楚,导致新手卡在安装环节。这篇文章的目标就是提供一个从零开始、手把手的保姆级教程。我们会详细拆解在Windows系统上部署DVWA的每一步,包括PHP、MySQL、Web服务器的配置,以及如何解决最常见的“数据库连接失败”等问题。文末也会提供整理好的安装包和配置文档,帮你跳过那些繁琐的搜索和试错过程。
对于网络安全初学者、渗透测试爱好者或者需要内部培训的工程师来说,一个能稳定运行的本地靶场是刚需。DVWA门槛不高,但完整搭建需要串联多个服务,这正是它的价值所在——模拟了一个真实的、需要多组件协作的Web应用环境。通过搭建和配置它,你不仅能学到漏洞知识,更能加深对Web应用架构的理解。
1. 核心能力速览
在开始动手之前,我们先快速了解DVWA是什么,以及搭建它需要准备什么。
| 能力项 | 说明 |
|---|---|
| 项目类型 | Web漏洞综合靶场(本地部署型) |
| 核心功能 | 集成SQL注入、XSS、文件上传、命令执行、CSRF、暴力破解等十多种常见Web漏洞,并提供低、中、高三种安全等级。 |
| 环境依赖 | PHP、MySQL、Web服务器(如Apache或Nginx)。本质是一个PHP+MySQL的Web应用。 |
| 部署方式 | 传统LAMP/WAMP环境部署,或使用Docker等集成环境。本文以Windows下传统部署为例。 |
| 硬件门槛 | 极低。普通家用电脑即可,对CPU、内存、显卡无特殊要求。 |
| 适合场景 | 网络安全自学、渗透测试技能练习、企业内部安全培训、CTF赛前热身。 |
| 安全边界 | 务必仅在本地或隔离的虚拟机环境中运行。切勿将DVWA部署在公网或内网生产环境,以免成为攻击跳板。 |
DVWA最大的特点就是“真实”且“可调”。漏洞是真实存在的,但你可以通过切换安全等级来观察不同防御措施的效果,从“毫无防护”到“有基本过滤”再到“有严格防护”,学习攻防两端的思路。
2. 适用场景与使用边界
2.1 谁适合使用DVWA?
- 网络安全初学者:通过实际操作,将抽象的漏洞概念(如“SQL注入”)转化为可视化的攻击过程和结果。
- 准备面试的安全工程师:DVWA涵盖的漏洞是面试高频考点,亲手实践一遍远胜死记硬背。
- 高校计算机/网络安全专业学生:作为课程实验或毕业设计的实践平台。
- 企业安全团队:用于对新员工进行基础的安全意识和技术培训。
2.2 DVWA能解决什么问题?
- 提供安全的练习环境:在合法、可控的环境下进行渗透测试,避免法律风险。
- 理解漏洞原理:每个漏洞模块都配有简单的源码,可以前后端对照学习。
- 掌握攻击手法:学习如何使用Burp Suite、SQLMap等工具对特定漏洞进行利用。
- 学习防御措施:通过调整安全等级,直观对比不同防护代码的效果。
2.3 重要使用边界与警告
- 绝对禁止公网部署:DVWA本身充满漏洞,一旦暴露在互联网上,会立即被攻击者扫描并利用,可能导致你的计算机被入侵,甚至成为攻击他人的肉鸡。
- 仅在隔离环境使用:推荐在个人电脑的虚拟机(如VMware、VirtualBox)中安装,与主机网络隔离。
- 遵守法律法规:所有练习行为仅限于本地靶场。切勿对未经授权的任何系统进行测试。
- 用于学习目的:DVWA是教学工具,其漏洞利用方式可能比较“古典”,旨在理解原理,并非最新的攻击技术。
3. 环境准备与前置条件
我们将在一台干净的Windows 10/11系统上搭建DVWA。你需要提前准备好以下软件和资源。
3.1 软件清单与下载
- PHP:DVWA是用PHP写的,需要PHP环境来解析运行。推荐版本PHP 5.4 - 7.4(与DVWA兼容性最好)。我们将使用 PHP 7.4。
- MySQL:用于存储DVWA的用户数据、会话等信息。推荐MySQL 5.x 或 MariaDB。我们将使用 MySQL 5.7。
- Web服务器:用于处理HTTP请求。选择Apache或Nginx。在Windows上,使用Apache更简单。我们将使用Apache 2.4。
- DVWA源码:从官方或可靠渠道下载。
- 文本编辑器:用于修改配置文件,如 Notepad++ 或 VS Code。
简化方案:你可以选择集成环境包,如XAMPP或PHPStudy,它们将Apache、MySQL、PHP打包在一起,一键安装。本文为了更清晰地理解各组件作用,采用分步安装的方式。文末提供的“安装包”即包含所有分步所需的组件。
3.2 安装目录规划
为了避免权限和路径问题,建议将所有组件安装在没有中文和空格的路径下。例如:
C:\WebServer\:作为我们的服务器根目录。C:\WebServer\php\:存放PHP。C:\WebServer\mysql\:存放MySQL。C:\WebServer\apache\:存放Apache。C:\WebServer\www\:存放我们的网站文件(包括DVWA)。
按照这个规划,我们先创建好C:\WebServer目录。
4. 安装部署与启动方式
接下来,我们按顺序安装并配置各个组件。
4.1 安装与配置PHP
- 下载:从PHP官网下载Windows版本的PHP 7.4 Non Thread Safe Zip包。
- 解压:将下载的ZIP文件解压到
C:\WebServer\php目录下。 - 配置PHP:
- 进入
C:\WebServer\php目录,将文件php.ini-development复制一份,并重命名为php.ini。 - 用文本编辑器打开
php.ini,找到并修改以下关键配置:; 启用必要的扩展模块(去掉前面的分号`;`) extension=mysqli extension=gd2 extension=mbstring extension=curl extension=openssl ; 设置时区 date.timezone = Asia/Shanghai ; 允许上传文件(DVWA文件上传模块需要) file_uploads = On upload_max_filesize = 2M - 保存并关闭
php.ini。
- 进入
- 将PHP加入系统环境变量(可选,但推荐):
- 右键“此电脑” -> “属性” -> “高级系统设置” -> “环境变量”。
- 在“系统变量”中找到并选中
Path,点击“编辑”。 - 点击“新建”,添加
C:\WebServer\php。 - 一路点击“确定”退出。
- 打开命令提示符(cmd),输入
php -v,如果显示PHP版本信息,说明配置成功。
4.2 安装与配置MySQL
- 下载:从MySQL官网下载MySQL 5.7的Windows ZIP Archive版本。
- 解压:将ZIP文件解压到
C:\WebServer\mysql目录。 - 初始化数据库:
- 在
C:\WebServer\mysql目录下,新建一个名为data的文件夹(用于存放数据库文件)。 - 以管理员身份打开命令提示符(cmd),切换到MySQL的bin目录:
cd C:\WebServer\mysql\bin - 执行初始化命令,并记住输出的初始随机密码(root用户的):
(使用mysqld --initialize-insecure --user=mysql --console--initialize-insecure参数会生成空密码,更简单。安全环境练习可用此参数。)
- 在
- 安装MySQL服务:
如果提示“Service successfully installed.”则表示成功。mysqld --install MySQL - 启动MySQL服务:
net start MySQL - 设置root密码(如果使用了insecure初始化):
- 登录MySQL(此时无密码):
mysql -u root - 在MySQL命令行中,执行以下命令设置新密码(例如设为
password):ALTER USER 'root'@'localhost' IDENTIFIED BY 'password'; FLUSH PRIVILEGES; EXIT;
- 登录MySQL(此时无密码):
4.3 安装与配置Apache
- 下载:从Apache Haus等站点下载适用于Windows的Apache 2.4二进制压缩包(注意选择与VC版本匹配的,如VC15)。
- 解压:将压缩包解压到
C:\WebServer\apache目录。 - 配置Apache:
- 用文本编辑器打开
C:\WebServer\apache\conf\httpd.conf。 - 修改服务器根目录:找到
Define SRVROOT,将其值修改为Apache的安装路径。
注意:Apache配置中使用正斜杠Define SRVROOT "C:/WebServer/apache"/。 - 加载PHP模块:在文件末尾添加以下配置,告诉Apache如何解析PHP文件。
# 加载PHP模块 LoadModule php7_module "C:/WebServer/php/php7apache2_4.dll" # 指定php.ini配置文件目录 PHPIniDir "C:/WebServer/php" # 添加对.php文件的处理 AddHandler application/x-httpd-php .php # 设置目录索引,优先显示index.php <IfModule dir_module> DirectoryIndex index.php index.html </IfModule> - 修改网站根目录:找到
<Directory "c:/Apache24/htdocs">(大约在245行左右),将其路径改为我们规划的网站目录:DocumentRoot "C:/WebServer/www" <Directory "C:/WebServer/www"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> - 保存并关闭
httpd.conf。
- 用文本编辑器打开
- 安装并启动Apache服务:
- 以管理员身份打开命令提示符,切换到Apache的bin目录:
cd C:\WebServer\apache\bin - 安装Apache服务:
httpd -k install - 启动Apache服务:
也可以在系统服务中找到“Apache2.4”并启动。httpd -k start
- 以管理员身份打开命令提示符,切换到Apache的bin目录:
- 测试Apache:打开浏览器,访问
http://localhost。如果看到Apache的欢迎页面,说明Apache安装成功。
4.4 部署与配置DVWA
- 下载DVWA:从官方GitHub仓库(
github.com/digininja/DVWA)下载ZIP包,或使用文末提供的整合包。 - 解压部署:将下载的DVWA压缩包解压,将其中的文件夹重命名为
dvwa,然后整个放到C:\WebServer\www\目录下。此时DVWA的访问路径将是http://localhost/dvwa/。 - 配置DVWA数据库连接:
- 进入
C:\WebServer\www\dvwa\config目录。 - 将文件
config.inc.php.dist复制一份,并重命名为config.inc.php。 - 用文本编辑器打开
config.inc.php。 - 找到数据库配置部分,根据你的MySQL设置进行修改。如果你按照上文设置,配置应如下:
$_DVWA[ 'db_server' ] = '127.0.0.1'; $_DVWA[ 'db_database' ] = 'dvwa'; $_DVWA[ 'db_user' ] = 'root'; $_DVWA[ 'db_password' ] = 'password'; // 改为你设置的MySQL root密码 $_DVWA[ 'db_port' ] = '3306'; - 保存文件。
- 进入
- 为DVWA创建数据库:
- 打开命令提示符,登录MySQL:
输入密码。mysql -u root -p - 在MySQL命令行中,执行以下命令创建数据库和用户(如果
config.inc.php中使用的是root用户,此步可省略创建用户):CREATE DATABASE IF NOT EXISTS dvwa; -- 如果你想创建一个专用用户(更安全),可以执行: -- CREATE USER 'dvwa'@'localhost' IDENTIFIED BY 'p@ssw0rd'; -- GRANT ALL PRIVILEGES ON dvwa.* TO 'dvwa'@'localhost'; -- FLUSH PRIVILEGES; EXIT;
- 打开命令提示符,登录MySQL:
5. 功能测试与效果验证
环境搭建完毕,现在我们来启动并验证DVWA是否正常工作。
5.1 启动所有服务并访问
- 确保MySQL和Apache服务都已启动(可以在“服务”管理窗口中查看,或使用
net start命令)。 - 打开浏览器,访问:
http://localhost/dvwa/。 - 你应该会看到DVWA的登录页面。默认的登录凭证是:
- 用户名:
admin - 密码:
password
- 用户名:
- 首次登录成功后会跳转到一个页面,提示你“数据库设置”未完成,需要点击页面中的“Create / Reset Database”按钮。
5.2 初始化数据库
- 点击“Create / Reset Database”按钮。
- 页面会执行一个脚本,在MySQL中创建DVWA所需的所有数据表,并插入默认数据(包括admin用户)。
- 如果一切顺利,页面会显示“Setup Successful”。如果失败,最常见的错误是:
- 数据库连接失败:检查
config.inc.php中的数据库IP、用户名、密码是否正确,以及MySQL服务是否运行。 - PHP函数被禁用:检查
php.ini中allow_url_fopen、allow_url_include等是否设置为On(DVWA某些模块需要)。
- 数据库连接失败:检查
- 初始化成功后,使用
admin/password重新登录,即可进入DVWA主界面。
5.3 核心功能模块验证
登录后,左侧是导航栏,包含了所有漏洞模块。我们快速验证几个核心模块,确保靶场功能完整。
5.3.1 SQL Injection (SQL注入)
- 点击左侧 “SQL Injection”。
- 在输入框中随意输入一个数字(如1),点击“Submit”。
- 预期结果:页面会返回该用户ID对应的用户信息(如“admin”)。
- 测试攻击:在输入框中输入
1' or '1'='1,点击提交。如果返回了数据库中的所有用户信息,说明SQL注入漏洞存在且可利用。 - 功能验证通过:说明后端PHP代码与MySQL数据库交互正常,漏洞环境生效。
5.3.2 XSS (跨站脚本)
- 点击左侧 “XSS reflected”。
- 在输入框中输入一段简单的JavaScript代码,例如
<script>alert('XSS')</script>,点击“Submit”。 - 预期结果:页面会弹出一个警告框,显示“XSS”。
- 功能验证通过:说明前端输入未经过滤直接输出到页面,反射型XSS漏洞存在。
5.3.3 File Upload (文件上传)
- 点击左侧 “File Upload”。
- 点击“浏览”,选择一个图片文件(如.jpg)上传。
- 预期结果:上传成功,页面显示文件路径和图片预览。
- 测试漏洞:尝试上传一个PHP Webshell文件(如一个包含
<?php phpinfo();?>的test.php文件)。在“低”安全等级下,应该能上传成功并访问执行。 - 功能验证通过:说明文件上传模块和服务器目录权限配置正常。
通过以上三个基本测试,可以确认DVWA的核心漏洞环境已经成功搭建并运行。
6. 安全等级切换与源码学习
DVWA的精髓在于其可调节的安全等级,这对应了不同强度的防御代码。
- 切换安全等级:在DVWA页面底部,找到 “DVWA Security” 区域。你可以选择 “Low”, “Medium”, “High” 或 “Impossible”。
- Low:基本无防护,代码中存在明显的漏洞。
- Medium:引入了一些基础的过滤函数(如
mysql_real_escape_string(),stripslashes()),但可能被绕过。 - High:使用了更严格的防护(如预处理语句、更复杂的正则过滤)。
- Impossible:理论上安全的代码,展示了最佳实践。
- 查看源码:在每个漏洞练习页面的右下角,有 “View Source” 和 “View Help” 按钮。点击 “View Source” 可以直接查看当前安全等级下,前端(HTML/JS)和后端(PHP)的源代码。这是学习漏洞原理和防御方法最直接的途径。
- 对比学习:尝试在 “Low” 等级下完成一次成功的SQL注入攻击,然后将安全等级切换到 “High”,使用同样的Payload再次尝试。你会发现攻击失效了,这时通过对比 “View Source” 中的代码差异,就能深刻理解预处理语句是如何防止SQL注入的。
7. 常见问题与排查方法
搭建过程中,90%的问题集中在环境配置和数据库连接上。这里汇总了最常见的错误及解决方案。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
访问http://localhost显示404或无法连接 | Apache服务未启动;端口被占用(如80端口被IIS、Skype占用) | 1. 检查服务中Apache是否运行。 2. 命令行执行 netstat -ano | findstr :80查看80端口占用。 | 1. 启动Apache服务。 2. 关闭占用80端口的程序,或修改Apache的 httpd.conf中的Listen指令,换用其他端口(如8080)。 |
访问http://localhost/dvwa显示空白页或PHP代码 | PHP模块未正确加载或解析。 | 1. 检查httpd.conf中加载PHP模块的路径是否正确。2. 检查 php.ini文件是否存在且路径正确。 | 1. 确认php7apache2_4.dll文件存在于PHP目录,且httpd.conf中路径指向它。2. 确认 PHPIniDir指向正确的php.ini所在目录。 |
| 点击 “Create / Reset Database” 失败,提示数据库连接错误 | config.inc.php配置错误;MySQL服务未启动;MySQL root密码错误。 | 1. 检查config.inc.php中的数据库IP、用户名、密码。2. 检查MySQL服务状态。 3. 尝试用命令行 mysql -u root -p登录验证密码。 | 1. 修正config.inc.php配置。2. 启动MySQL服务。 3. 如果忘记密码,可参考MySQL官方文档重置root密码。 |
| PHP函数被禁用,导致某些模块(如Command Execution)无法使用 | php.ini中相关函数被禁用(disable_functions列表)。 | 查看php.ini中的disable_functions配置项。 | 从disable_functions列表中移除system,exec,passthru,shell_exec等函数(仅限本地测试环境!)。 |
| 文件上传模块上传失败,提示“目录不可写” | Apache服务进程对dvwa\hackable\uploads\目录没有写入权限。 | 检查C:\WebServer\www\dvwa\hackable\uploads目录的权限。 | 右键该文件夹 -> “属性” -> “安全” -> 编辑,为 “Users” 或 “Everyone” 组添加“写入”权限。 |
| 登录DVWA时,提示“Your password has expired.” | MySQL的root用户密码过期策略导致。 | 在MySQL命令行中执行SELECT user, host, password_expired FROM mysql.user;查看。 | 登录MySQL,执行ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';重置密码。 |
8. 最佳实践与使用建议
为了让你的DVWA学习之旅更顺畅,这里有一些经验之谈。
- 虚拟机隔离:强烈建议在VMware或VirtualBox中安装一个Windows或Linux虚拟机,在虚拟机内搭建DVWA。这样即使环境被意外破坏,也可以快速恢复快照,完全不影响主机。
- 使用集成环境入门:如果你是第一次接触PHP+MySQL环境,可以先使用PHPStudy或XAMPP快速搭建。它们提供图形化界面,能一键启动/停止所有服务,避免繁琐配置。等熟悉后,再尝试手动分步安装以加深理解。
- 配合专业工具:DVWA是一个“靶子”,你需要“武器”来练习。
- Burp Suite:用于拦截和修改HTTP请求,是测试SQL注入、XSS、CSRF等漏洞的瑞士军刀。
- SQLMap:自动化SQL注入工具,在DVWA的SQL注入模块中可以体验其强大功能。
- 浏览器开发者工具:F12打开,用于分析前端代码、监控网络请求、调试JavaScript,是分析XSS和客户端漏洞的必备。
- 系统化学习路径:不要盲目乱点。建议按照以下顺序深入学习每个漏洞:
- 阅读官方帮助文档(“View Help”)。
- 在 “Low” 安全等级下,手动构造Payload进行攻击,理解漏洞触发原理。
- 查看 “Low” 等级的源码,找出漏洞点。
- 切换到 “Medium” 等级,尝试绕过其防御措施,并查看源码学习其过滤逻辑。
- 切换到 “High” 或 “Impossible” 等级,学习安全的编码实践。
- 文档与笔记:在练习每个漏洞时,记录下:
- 漏洞原理(用自己的话描述)。
- 攻击成功的Payload。
- 不同安全等级的源码差异和防御思路。
- 利用该漏洞的自动化工具(如SQLMap)的命令参数。 这将成为你宝贵的学习笔记和知识库。
- 安全意识:时刻记住,你是在一个封闭的沙箱中学习攻击技术。这些技术绝不能用于未经授权的真实网站。技术的价值在于防御,理解攻击是为了更好地保护。
9. 资源获取与下一步
为了方便大家,我已经将本文所需的所有软件组件(PHP 7.4、MySQL 5.7、Apache 2.4、DVWA 1.10源码)以及一份详细的配置文档打包整理。你可以在一些常用的开源软件镜像站或技术社区资源区搜索“DVWA Windows 一键环境包”或类似关键词找到整合资源,这能节省大量下载和配置时间。
成功搭建DVWA只是第一步,真正的学习在于持续地练习和思考。接下来,你可以:
- 逐个攻破所有模块:从Brute Force到CSP Bypass,确保每个漏洞类型都亲手实践一遍。
- 尝试自动化工具:在手动理解原理后,使用SQLMap对注入点进行自动化探测和利用,学习工具的使用。
- 搭建其他靶场:在掌握DVWA后,可以挑战更具难度的靶场,如WebGoat、bWAPP、Pikachu或HackTheBox上的在线实验室。
- 阅读安全书籍:结合《白帽子讲Web安全》、《Web安全深度剖析》等书籍,构建系统化的知识体系。
DVWA就像网络安全学习的“新手村”,它可能没有最炫酷的漏洞,但涵盖了最基础、最核心的原理。扎实地走完这个过程,你对Web安全的认知会有一个质的飞跃。建议收藏本文,在搭建遇到问题时随时回来查阅。