明确需求
部署 DVWA 最快捷的方式是使用 Docker 容器。其次,Kali Linux的软件源中已包含 DVWA,可通过 sudo apt install dvwa 安装,并自带启动脚本 dvwa-start。这篇笔记针对 Ubuntu Server 26.04 TLS 手动搭建 Apache2、MySQL、PHP 等运行环境,如果你是 Ubuntu Desktop 或其他操作系统的读者仅供参考。
关于 DVWA
DVWA(Damn Vulnerable Web Application) 是一个故意包含大量安全漏洞的PHP/MySQL Web应用程序。它的名字直译是“该死的易受攻击的Web应用”,设计初衷就是为了成为一个供安全人员合法练习技能、测试工具的教学靶场。DVWA 极易被入侵!禁止将其部署到任何面向互联网的服务器上,请务必在完全隔离的本地环境(例如:虚拟机)中使用。这能确保即使靶场被“攻破”,也不会影响你的主机或其他网络。
系统信息
虚拟机平台:Vmware Workstation 26H1
操作系统:Ubuntu Server 26.04 TLS
网络适配器:NAT网络转换
提示: 为了保证我的 Kali Linux 和 Ubuntu Server 处于同一局域网,因此我在创建 Vmware 虚拟机配置网络适配器时使用了 NAT 网络转换技术,虚拟机的网络流量均通过主机转发。NAT 隐藏了虚拟机的真实 IP 地址和拓扑结构,外部攻击者无法直接访问虚拟机,保障了 Vmware 虚拟机的安全性。其次,我们需要保证家庭网络成员无论何时都能够正常使用,无论我们正在进行什么测试,在实际生活生产的网络上制造流量一定会产生影响,这一定是不道德的甚至是不合法的行为。即使你正在与目标合作,也应该尽可能的降低对目标正常业务活动的影响。
环境准备
首先更新系统软件包:
sudo apt update
sudo apt full-upgrade
DVWA 基于 PHP 和 MySQL 运行,需要安装 LAMP(Linux + Apache + MySQL + PHP)全套组件:
sudo apt install -y apache2 mysql-server php libapache2-mod-php php-mysql php-gd php-curl php-xml php-mbstring php-zip
说明:Ubuntu 26.04 LTS 默认使用 PHP 8.5+ 和 MariaDB(MySQL 的社区分支),以上命令兼容。
启动 Apache 和 MySQL 服务并将其设置为开机自启动:
sudo systemctl start apache2
sudo systemctl enable apache2
sudo systemctl start mysql
sudo systemctl enable mysql
验证服务状态:
sudo systemctl status apache2
sudo systemctl status mysql
下载 DVWA
从官方 GitHub 仓库克隆 DVWA 源码:
sudo cd /tmp
sudo git clone https://github.com/digininja/DVWA.git
将 DVWA 文件移动到 Apache 的 Web 根目录:
sudo rsync -avP ./DVWA/ /var/www/html/
删除 Apache 默认首页:
sudo rm -f /var/www/html/index.html
配置 DVWA
复制并重命名配置文件:
sudo cd /var/www/html/config
sudo cp config.inc.php.dist config.inc.php
检查配置文件:
sudo nano /var/www/html/config/config.inc.php
找到并确认以下数据库配置的部分正确(通常保持默认即可):
$_DVWA['db_server'] = getenv('DB_SERVER') ?: '127.0.0.1';
$_DVWA['db_database'] = getenv('DB_DATABASE') ?: 'dvwa';
$_DVWA['db_user'] = getenv('DB_USER') ?: 'dvwa';
$_DVWA['db_password'] = getenv('DB_PASSWORD') ?: 'p@ssw0rd';
$_DVWA['db_port'] = getenv('DB_PORT') ?: '3306';
编辑 PHP 配置文件,启用 DVWA 所需的设置:
sudo nano /etc/php/*/apache2/php.ini
注意:/etc/php/*/apache2/php.ini 中的 * 是 PHP 版本号,Ubuntu 26.04 中可能是 8.5 或 8.4,请用实际版本号替换。可以用 php -v 查看版本。
找到以下参数并修改成以下这样:
allow_url_include = On
allow_url_fopen = On
display_errors = On
DVWA 需要某些目录可写:
sudo chmod 777 /var/www/html/config
sudo chmod 777 /var/www/html/hackable/uploads/
打开 MySQL 并创建数据库和用户:
sudo mysql
在 MySQL 命令行中执行以下 SQL 语句:
CREATE DATABASE dvwa;
CREATE USER 'dvwa'@'localhost' IDENTIFIED BY 'p@ssw0rd';
GRANT ALL PRIVILEGES ON dvwa.* TO 'dvwa'@'localhost';
FLUSH PRIVILEGES;
EXIT;
如果你在 config.inc.php 中修改了数据库密码,请确保此处使用相同的密码。
默认情况下 Apache 仅允许本机访问,需要进行以下配置才能让同局域网的其他机器(例如: Kali Linux)访问。
修改 Apache 监听地址:
sudo nano /etc/apache2/ports.conf
确保包含以下内容(监听所有网络接口的 80 端口):
Listen 0.0.0.0:80
修改站点配置文件:
sudo nano /etc/apache2/sites-available/000-default.conf
在 <VirtualHost *:80> 内添加或确认包含以下内容,以允许来自所有 IP 的访问:
<VirtualHost *:80>
DocumentRoot /var/www/html
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
注意: 谨慎对待空格
最终结果长这样:

重启 Apache 使配置生效:
sudo systemctl restart apache2
Ubuntu Server 默认可能未启用防火墙,但为了安全建议配置。使用 UFW(Uncomplicated Firewall)允许 HTTP 流量:
# 检查 UFW 状态
sudo ufw status
# 如果未启用,允许 SSH(防止远程连接断开)和 HTTP
sudo ufw allow ssh
sudo ufw allow 80/tcp
# 启用 UFW
sudo ufw enable
提示: 如果你不在乎实验环境的安全性,关闭防火墙其实更方便。
如果你打开了防火墙并配置正确,检查防火墙状态你或许可以看到一下内容:

最后这个问题不在安装和配置环节之内,但你很有必要检查一下! /var/www/html/dvwa/includes/DBMS/MySQL.php 在给数据库添加一个叫 role 的字段(列)时,SQL 语句写漏了表名。其次,有些 MySQL 版本(例如:5.7 及以下)不支持 ADD COLUMN IF NOT EXISTS 这种语法。
如果你触发了相关问题,其错误信息如下:
Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS role VARCHAR(20) DEFAULT 'user' at line 1 in /var/www/html/dvwa/includes/DBMS/MySQL.php:68 Stack trace: #0 /var/www/html/dvwa/includes/DBMS/MySQL.php(68): mysqli_query() #1 /var/www/html/dvwa/setup.php(23): include_once(…) #2 {main} thrown in /var/www/html/dvwa/includes/DBMS/MySQL.php on line 68
解决方案是编辑 /var/www/html/dvwa/includes/DBMS/MySQL.php 的源代码,删除所有 IF NOT EXISTS 语句。我记得一共有两个,其中一个如图所示在第 68 行,另一个好像在第 140 行左右,请各位读者务必仔细检查。
编辑 /var/www/html/dvwa/includes/DBMS/MySQL.php:
sudo nano /var/www/html/dvwa/includes/DBMS/MySQL.php
最后,查看 Ubuntu Server 的 IP 地址:
sudo ip addr show
在 Kali Linux 上打开浏览器,访问:http://Ubuntu 的 IP 地址/setup.php(例如:http://192.168.1.110/setup.php),在 setup.php 页面底部,点击 “Create / Reset Database” 按钮。DVWA 将自动创建所需的数据表。
数据库创建成功后,页面会自动跳转或手动访问登录页面:http://Ubuntu 的 IP 地址/login.php
使用默认账号密码登录,用户名:admin,密码:password
如果配置成功,你将看到如下 DVWA 主页:

今后你需要进行测试时,仅需将 Ubuntu Server 服务器开启并登录即可。如果你发现重启 Ubuntu Server 之后就不能访问 DVWA了,请检查 Apache2 和 MySQL 是否启动以及是否将其设置为开机自启动。
最后总结
还是那句话,网络安全需要靠实践去换来经验,你能耐心看到这里并且成功安装和配置了 DVWA,那么这是一件令作者感到非常惊讶的一件事情。首先,笔记系列文章是因为作者在自学网络安全的途中一些重大经过和其中遇到的问题,由作者事后整理而得来的解决方案,方便作者以后再次遇到类似问题时便于翻看(其实我就是把 CSDN 当成免费的网络笔记本了)。其次,我之所以选择将 DVWA 部署在 Ubuntu Server 上而不是图方便使用容器或直接在 Kali Linux 上安装是因为我想从一定程度上还原现实生活生产,你需要通过网络浏览器或其他各种工具与服务器建立连接来访问它,就像现实生活中的 web 应用运行在服务器上而不是你自己的电脑上一样,这似乎是一个很折磨自己的选择,我不知道有没有读者跟我想到一块去了。最后,非常感谢您耐心且仔细地阅读,祝愿您的生活工作轻松愉快!

