该死的易受攻击的 Web 应用程序 (DVWA) 是一个非常容易受到攻击的 PHP/MySQL Web 应用程序。其主要目标是帮助安全专业人员在合法环境中测试他们的技能和工具,帮助 Web 开发人员更好地了解保护 Web 应用程序安全的流程,并帮助学生和教师在受控课程中了解 Web 应用程序安全性房间环境。
DVWA 的目标是通过简单直观的界面练习一些最常见的 Web 漏洞(具有不同的难度级别) 。请注意,该软件存在已记录和未记录的漏洞。这是故意的。我们鼓励您尝试并发现尽可能多的问题。
该死的脆弱 Web 应用程序非常脆弱!不要将其上传到托管提供商的公共 html 文件夹或任何面向 Internet 的服务器,因为它们会受到损害。建议使用虚拟机(如VirtualBox或VMware),设置为NAT网络模式。在访客计算机内,您可以下载并安装用于 Web 服务器和数据库的 XAMPP。
我们对任何人使用此应用程序 (DVWA) 的方式不承担任何责任。我们已明确该应用程序的用途,不得恶意使用。我们已发出警告并采取措施阻止用户将 DVWA 安装到实时 Web 服务器上。如果您的网络服务器因安装 DVWA 而受到损害,这不是我们的责任,而是上传和安装它的人员的责任。
该文件是该死的易受攻击的 Web 应用程序 (DVWA) 的一部分。
该死的易受攻击的 Web 应用程序 (DVWA) 是免费软件:您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款重新分发它和/或修改它,无论是许可证的第 3 版,还是(由您选择)任何更高版本。
该死的易受攻击的 Web 应用程序 (DVWA) 的发布是希望它有用,但没有任何保证;甚至没有适销性或特定用途适用性的默示保证。 有关更多详细信息,请参阅 GNU 通用公共许可证。
您应该已经收到一份 GNU 通用公共许可证以及该死的易受攻击的 Web 应用程序 (DVWA)。 如果没有,请参阅 https://www.gnu.org/licenses/。
该文件有多种语言版本:
阿拉伯语: ??????
中文:简体中文
法语:Français
韩语: 한국어
波斯语: فר
波兰语: Polski
葡萄牙语:Português
西班牙语:Español
土耳其语:Türkçe
印度尼西亚:印度尼西亚
越南语:越南语
如果您想贡献翻译,请提交 PR。但请注意,这并不意味着只需通过谷歌翻译运行它并发送出去,那些将被拒绝。通过添加新的“README.xx.md”文件来提交您的翻译版本,其中 xx 是您所需语言的两个字母代码(基于 ISO 639-1)。
虽然 DVWA 有各种版本,但唯一受支持的版本是官方 GitHub 存储库中的最新源。您可以从存储库克隆它:
git 克隆 https://github.com/digininja/DVWA.git
或者下载文件的 ZIP。
请注意,这不是官方的 DVWA 脚本,它是由 IamCarron 编写的。创建该脚本需要做大量的工作,并且在创建该脚本时,它没有执行任何恶意操作,但是建议您在系统上盲目运行该脚本之前检查该脚本,以防万一。请将任何错误报告给 IamCarron,而不是在这里。
基于 Debian 的计算机上的 DVWA 自动配置脚本,包括 Kali、Ubuntu、Kubuntu、Linux Mint、Zorin OS...
注意:此脚本需要 root 权限,并且是为基于 Debian 的系统量身定制的。确保您以 root 用户身份运行它。
操作系统:基于 Debian 的系统(Kali、Ubuntu、Kubuntu、Linux Mint、Zorin OS)
权限:以root用户执行
这将下载 @IamCarron 编写的安装脚本并自动运行。如果我们不信任作者和脚本(就像我们审查时那样),则不会将其包含在此处,但总有可能有人会作弊,因此,如果您觉得不安全,请在不审查的情况下运行其他人的代码自己下载,按照手动流程操作,下载后即可查看。
sudo bash -c "$(curl --fail --show-error --silent --location https://raw.githubusercontent.com/IamCarron/DVWA-Script/main/Install-DVWA.sh)"
下载脚本:
wget https://raw.githubusercontent.com/IamCarron/DVWA-Script/main/Install-DVWA.sh
使脚本可执行:
chmod +x 安装-DVWA.sh
以 root 身份运行脚本:
sudo ./安装-DVWA.sh
在 VirtualBox 中运行的 Kali 上安装 DVWA
使用 XAMPP 在 Windows 上安装 DVWA
在 Windows 10 上安装该死的易受攻击的 Web 应用程序 (DVWA)
如果您还没有设置 Web 服务器,安装 DVWA 最简单的方法是下载并安装 XAMPP。
XAMPP 是一个非常易于安装的 Apache 发行版,适用于 Linux、Solaris、Windows 和 Mac OS X。该软件包包括 Apache Web 服务器、MySQL、PHP、Perl、FTP 服务器和 phpMyAdmin。
该视频将引导您完成 Windows 的安装过程,但其他操作系统的安装过程应该类似。
感谢 hoang-himself 和 JGillam,对master
分支的每次提交都会导致构建 Docker 镜像,并准备好从 GitHub 容器注册表中拉取。
有关您所获得内容的更多信息,您可以浏览预构建的 Docker 映像。
先决条件:Docker 和 Docker Compose。
如果您使用 Docker Desktop,则这两个都应该已经安装。
如果您更喜欢 Linux 上的 Docker Engine,请务必遵循其安装指南。
我们为最新的 Docker 版本提供支持,如上所示。如果您使用的是 Linux 和软件包管理器附带的 Docker 软件包,它可能也可以工作,但只能尽力提供支持。
将 Docker 从包管理器版本升级到上游需要卸载旧版本,如 Ubuntu、Fedora 和其他版本的手册中所示。您的 Docker 数据(容器、映像、卷等)不应受到影响,但如果您确实遇到问题,请务必告诉 Docker 并同时使用搜索引擎。
然后,开始:
运行docker version
和docker compose version
查看是否正确安装了 Docker 和 Docker Compose。您应该能够在输出中看到它们的版本。
例如:
>>> docker version
Client:
[...]
Version: 23.0.5
[...]
Server: Docker Desktop 4.19.0 (106363)
Engine:
[...]
Version: 23.0.5
[...]
>>> docker compose version
Docker Compose version v2.17.3
如果您没有看到任何内容或收到命令未找到错误,请按照先决条件设置 Docker 和 Docker Compose。
克隆或下载此存储库并解压(请参阅下载)。
打开您选择的终端并将其工作目录更改为该文件夹 ( DVWA
)。
运行docker compose up -d
。
DVWA 现已在http://localhost:4280
上提供。
请注意,为了在容器中运行 DVWA,Web 服务器正在侦听端口 4280,而不是通常的 80 端口。有关此决定的更多信息,请参阅我想在其他端口上运行 DVWA。
如果您进行了本地更改并希望从本地构建项目,请转到compose.yml
并将pull_policy: always
更改为pull_policy: build
。
运行docker compose up -d
应该会触发 Docker 从本地构建映像,无论注册表中是否有可用的内容。
另请参阅: pull_policy
。
理想情况下,您应该使用最新的稳定版本的 PHP,因为这是该应用程序将开发和测试的版本。
不会为尝试使用 PHP 5.x 的任何人提供支持。
低于 7.3 的版本存在会导致问题的已知问题,大多数应用程序都可以运行,但随机情况可能无法运行。除非您有充分的理由使用这样的旧版本,否则不会提供支持。
如果您使用基于 Debian 的 Linux 发行版,则需要安装以下软件包(或其等效软件包) :
阿帕奇2
libapache2-mod-php
mariadb 服务器
mariadb 客户端
php php-mysqli
php-gd
我建议在此之前进行更新,这样您就可以确保获得所有内容的最新版本。
易于更新 apt install -y apache2 mariadb-服务器 mariadb-客户端 php php-mysqli php-gd libapache2-mod-php
该网站将使用 MySQL 而不是 MariaDB,但我们强烈推荐 MariaDB,因为它开箱即用,而您必须进行更改才能使 MySQL 正常工作。
DVWA 附带了其配置文件的虚拟副本,您需要将其复制到位,然后进行适当的更改。在 Linux 上,假设您位于 DVWA 目录中,可以按如下方式完成此操作:
cp config/config.inc.php.dist config/config.inc.php
在 Windows 上,如果您隐藏文件扩展名,这可能会有点困难,如果您对此不确定,这篇博客文章对此进行了更多解释:
如何让 Windows 显示文件扩展名
您还可以使用环境变量来设置大多数设置,而不是修改配置文件。在 Docker 或 Kubernetes 部署中,这允许您修改配置而无需创建新的 Docker 映像。您将在 config/config.inc.php.dist 文件中找到变量。
如果要将默认安全级别设置为“低”,只需将以下行添加到 compose.yml 文件中:
环境: - DB_SERVER=数据库 - DEFAULT_SECURITY_LEVEL=低
要设置数据库,只需单击主菜单中的Setup DVWA
按钮,然后单击Create / Reset Database
按钮。这将为您创建/重置数据库并包含一些数据。
如果您在尝试创建数据库时收到错误,请确保./config/config.inc.php
中的数据库凭据正确。这与示例文件 config.inc.php.dist 不同。
默认情况下,变量设置为以下内容:
$_DVWA[ 'db_server'] = '127.0.0.1';$_DVWA[ 'db_port'] = '3306';$_DVWA[ 'db_user' ] = 'dvwa';$_DVWA[ 'db_password' ] = 'p@ssw0rd ';$_DVWA[ 'db_database' ] = 'dvwa';
注意,如果您使用的是MariaDB而不是MySQL(Kali中默认使用MariaDB),那么您不能使用数据库root用户,您必须创建一个新的数据库用户。为此,请以 root 用户身份连接到数据库,然后使用以下命令:
MariaDB [(none)]> create database dvwa;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> create user dvwa@localhost identified by 'p@ssw0rd';
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> grant all on dvwa.* to dvwa@localhost;
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
有些工具不能很好地支持身份验证,因此不能与 DVWA 一起使用。为了解决这个问题,有一个配置选项可以禁用身份验证检查。为此,只需在配置文件中设置以下内容:
$_DVWA[ 'disable_authentication' ] = true;
您还需要将安全级别设置为适合您想要执行的测试的安全级别:
$_DVWA[ 'default_security_level' ] = '低';
在此状态下,您无需登录并设置任何cookie即可访问所有功能。
./hackable/uploads/
- 需要可由 Web 服务写入(用于文件上传)。
在 Linux 系统上,可能在/etc/php/xx/fpm/php.ini
或/etc/php/xx/apache2/php.ini
中找到。
允许远程文件包含 (RFI):
allow_url_include = on
[allow_url_include]
allow_url_fopen = on
[allow_url_fopen]
要确保 PHP 显示所有错误消息:
display_errors = on
[显示错误]
display_startup_errors = on
[显示启动错误]
确保在进行更改后重新启动 php 服务或 Apache。
这仅是“不安全验证码”实验室所必需的,如果您不使用该实验室,则可以忽略此部分。
从 https://www.google.com/recaptcha/admin/create 生成了一对 API 密钥。
然后将它们放入./config/config.inc.php
的以下部分:
$_DVWA[ 'recaptcha_public_key' ]
$_DVWA[ 'recaptcha_private_key' ]
默认用户名 = admin
默认密码= password
...很容易被暴力破解;)
登录网址:http://127.0.0.1/login.php
注意:如果您将 DVWA 安装到不同的目录中,情况将会有所不同。
这些假设您使用的是基于 Debian 的发行版,例如 Debian、Ubuntu 和 Kali。对于其他发行版,请遵循,但在适当的情况下更新命令。
如果您使用 Docker Desktop,则可以从图形应用程序访问日志。一些小细节可能会随着新版本的变化而改变,但访问方法应该是相同的。
也可以从终端访问日志。
打开终端并将其工作目录更改为 DVWA
显示合并的日志
docker 撰写日志
如果您想将日志导出到文件,例如dvwa.log
docker 撰写日志 > dvwa.log
默认情况下,我们不使用端口 80,原因如下:
某些用户可能已经在端口 80 上运行某些内容。
某些用户可能使用无根容器引擎(例如 Podman),并且 80 是特权端口(< 1024)。需要额外的配置(例如设置net.ipv4.ip_unprivileged_port_start
),但您必须自己研究。
您可以通过更改compose.yml
文件中的端口绑定来在不同端口上公开 DVWA。例如,您可以更改
端口: - 127.0.0.1:4280:80
到
端口: - 127.0.0.1:8806:80
现在可以通过http://localhost:8806
访问 DVWA。
如果您希望 DVWA 不仅可以从您自己的设备上独占访问,而且还可以在您的本地网络上访问(例如,因为您正在为车间设置测试机器),您可以从端口中删除127.0.0.1:
映射(或将其替换为您的 LAN IP)。这样它将在所有可用设备上监听。安全的默认设置应该始终是仅在本地环回设备上侦听。毕竟,它是一个在您的计算机上运行的非常脆弱的 Web 应用程序。
当 Docker 启动时,包含的compose.yml
文件会自动运行 DVWA 及其数据库。
要禁用此功能,您可以删除或注释掉compose.yml
文件中的restart: unless-stopped
行。
如果您想暂时禁用此行为,可以运行docker compose stop
,或使用 Docker Desktop,找到dvwa
并单击“停止”。此外,您可以删除容器,或运行docker compose down
。
在 Linux 系统上,Apache 默认生成两个日志文件, access.log
和error.log
,在基于 Debian 的系统上,这些文件通常位于/var/log/apache2/
中。
提交错误报告、问题或类似内容时,请至少包含每个文件的最后五行。在基于 Debian 的系统上,您可以像这样获得这些:
tail -n 5 /var/log/apache2/access.log /var/log/apache2/error.log
如果您遇到此问题,您需要了解文件位置。默认情况下,Apache 文档根目录(它开始查找 Web 内容的位置)是/var/www/html
。如果将文件hello.txt
放入此目录中,要访问它,您将浏览到http://localhost/hello.txt
。
如果您创建了一个目录并将文件放入其中 - /var/www/html/mydir/hello.txt
- 那么您将需要浏览到http://localhost/mydir/hello.txt
。
Linux 默认情况下区分大小写,因此在上面的示例中,如果您尝试浏览其中任何一个,您将收到404 Not Found
:
http://localhost/MyDir/hello.txt
http://localhost/mydir/Hello.txt
http://localhost/MYDIR/hello.txt
这对 DVWA 有何影响?大多数人使用 git 将 DVWA 克隆到/var/www/html
中,这为他们提供了目录/var/www/html/DVWA/
其中包含所有 DVWA 文件。然后,他们浏览到http://localhost/
并获得404
或默认的 Apache 欢迎页面。由于文件位于 DVWA 中,因此您必须浏览到http://localhost/DVWA
。
另一个常见错误是浏览http://localhost/dvwa
这将给出404
因为就 Linux 目录匹配而言, dvwa
不是DVWA
。
因此,安装完成后,如果您尝试访问该站点并收到404
错误,请考虑一下您将文件安装到了哪里、它们相对于文档根目录的位置以及您使用的目录的情况如何。
这通常是一个配置问题隐藏着另一个问题。默认情况下,PHP 不显示错误,因此,如果您在设置过程中忘记打开错误显示,则任何其他问题(例如无法连接到数据库)都会阻止应用程序加载,但会显示消息告诉您什么错误的将被隐藏。
要解决此问题,请确保按照 PHP 配置中所述设置display_errors
和display_startup_errors
,然后重新启动 Apache。
如果您在运行安装脚本时看到以下内容,则意味着配置文件中的用户名或密码与数据库上配置的用户名或密码不匹配:
Database Error #1045: Access denied for user 'notdvwa'@'localhost' (using password: YES).
该错误告诉您您正在使用用户名notdvwa
。
以下错误表明您将配置文件指向了错误的数据库。
SQL: Access denied for user 'dvwa'@'localhost' to database 'notdvwa'
这表示您正在使用用户dvwa
并尝试连接到数据库notdvwa
。
首先要做的就是仔细检查您认为放入配置文件中的内容是否实际存在。
如果它符合您的预期,下一步要做的就是检查您是否可以在命令行上以用户身份登录。假设您的数据库用户为dvwa
,密码为p@ssw0rd
,请运行以下命令:
mysql -u dvwa -pp@ssw0rd -D dvwa
注意:-p后面不能有空格
如果看到以下内容,则说明密码正确:
Welcome to the MariaDB monitor. Commands end with ; or g.
Your MariaDB connection id is 14
Server version: 10.3.22-MariaDB-0ubuntu0.19.10.1 Ubuntu 19.10
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
MariaDB [dvwa]>
由于您可以在命令行上进行连接,因此配置文件中可能存在问题,请仔细检查,如果仍然无法正常工作,则提出问题。
如果您看到以下内容,则表明您使用的用户名或密码错误。重复数据库设置步骤,并确保在整个过程中使用相同的用户名和密码。
ERROR 1045 (28000): Access denied for user 'dvwa'@'localhost' (using password: YES)
如果您收到以下信息,则用户凭据正确,但用户无权访问数据库。再次重复设置步骤并检查您正在使用的数据库名称。
ERROR 1044 (42000): Access denied for user 'dvwa'@'localhost' to database 'dvwa'
您可能得到的最终错误是这样的:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
这不是身份验证问题,而是告诉您数据库服务器未运行。从以下内容开始
sudo 服务 mysql 启动
与此类似的错误:
Fatal error: Uncaught mysqli_sql_exception: Connection refused in /var/sites/dvwa/non-secure/htdocs/dvwa/includes/dvwaPage.inc.php:535
意味着您的数据库服务器未运行或者您的配置文件中的 IP 地址错误。
检查配置文件中的这一行以查看数据库服务器的预期位置:
$_DVWA[ 'db_server' ] = '127.0.0.1';
然后转到该服务器并检查它是否正在运行。在 Linux 中,这可以通过以下方式完成:
systemctl 状态 mariadb.service
你正在寻找这样的东西,重要的是它说active (running)
。
● mariadb.service - MariaDB 10.5.19 数据库服务器 已加载:已加载(/lib/systemd/system/mariadb.service;已启用;预设:已启用) 活跃:自 2024 年 3 月 14 日星期四 16:04:25 GMT 起活跃(运行); 1 周 5 天前
如果它没有运行,您可以通过以下方式启动它:
sudo systemctl 停止 mariadb.service
记下sudo
并确保根据要求输入 Linux 用户密码。
在 Windows 中,检查 XAMPP 控制台中的状态。
使用最新版本的 MySQL,PHP 无法再以默认配置与数据库通信。如果您尝试运行安装脚本并收到以下消息,则表示您已进行配置。
Database Error #2054: The server requested authentication method unknown to the client.
你有两个选择,最简单的就是卸载 MySQL 并安装 MariaDB。以下是MariaDB项目的官方指南:
https://mariadb.com/resources/blog/how-to-migrate-from-mysql-to-mariadb-on-linux-in- Five-steps/
或者,按照以下步骤操作:
以 root 身份编辑以下文件: /etc/mysql/mysql.conf.d/mysqld.cnf
在[mysqld]
行下,添加以下内容: default-authentication-plugin=mysql_native_password
重启数据库: sudo service mysql restart
检查数据库用户的身份验证方法:
mysql> 从 mysql.user 中选择主机、用户、插件,其中 mysql.user.User = 'dvwa';+------------+-------------- ----+------------------------+|主持人|用户 |插件 |+------------+----------------+---------------- --------+|本地主机 | dvwa | caching_sha2_password |+------------+--------------------------------+---------------- --------+1 行集合(0.00 秒)
您可能会看到caching_sha2_password
。如果这样做,请运行以下命令:
mysql> 更改用户 dvwa@localhost 通过 'p@ssw0rd' 识别 mysql_native_password;
重新运行检查,您现在应该看到mysql_native_password
。
mysql> 从 mysql.user 中选择主机、用户、插件,其中 mysql.user.User = 'dvwa';+-----------+------+-------- ----------------+|主持人|用户 |插件 |+------------+------+------------------------+|本地主机 | dvwa | mysql_native_password |+------------+---------+------------------------+集合中的 1 行(0.00 秒)
完成所有这些之后,设置过程现在应该可以正常进行。
如果您想了解更多信息,请参阅以下页面:https://www.php.net/manual/en/mysqli.requirements.php。
数据库服务器未运行。在基于 Debian 的发行版中,这可以通过以下方式完成:
sudo 服务 mysql 启动
出现这些错误的原因有多种,但最有可能的是您运行的数据库服务器版本与 PHP 版本不兼容。
当您将最新版本的 MySQL 作为 PHP 运行并且运行状况不佳时,最常出现这种情况。最好的建议是,放弃 MySQL 并安装 MariaDB,因为这不是我们可以支持的。
有关更多信息,请参阅:
https://www.ryadel.com/en/fix-mysql-server-gone-away-packets-order-similar-mysql-lated-errors/
Apache 可能没有足够高的权限来在 Web 服务器上运行命令。如果您在 Linux 下运行 DVWA,请确保您以 root 身份登录。在 Windows 下以管理员身份登录。
您可能会遇到 SELinux 问题。 禁用 SELinux 或运行以下命令以允许 Web 服务器与数据库通信:
setebool -P httpd_can_network_connect_db 1
有关最新的故障排除信息,请阅读 git 存储库中的开放式和封闭式票证:
https://github.com/digininja/DVWA/issues
在提交票证之前,请确保您正在运行存储库中的最新版本的代码。这不是最新版本,这是 master 分支的最新代码。
如果提票,请至少提交以下信息:
操作系统
无论您报告的错误发生后,Web 服务器错误日志中的最后 5 行都会立即出现
如果是数据库认证问题,请执行上述步骤并截图每个步骤。提交这些内容以及显示数据库用户和密码的配置文件部分的屏幕截图。
完整描述出了什么问题、您预计会发生什么以及您已尝试采取哪些措施来解决问题。 “登录损坏”不足以让我们了解您的问题并帮助解决它。
我将尝试整理一些教程视频,介绍一些漏洞,并展示如何检测它们以及如何利用它们。以下是我迄今为止所做的:
查找并利用反射型 XSS
对此的支持是有限的,在提出问题之前,请确保您准备好进行调试,不要简单地声称“它不起作用”。
默认情况下,SQLi 和 Blind SQLi 是针对站点使用的 MariaDB/MySQL 服务器完成的,但也可以切换为针对 SQLite3 进行 SQLi 测试。
我不会介绍如何让 SQLite3 与 PHP 一起工作,但这应该是安装php-sqlite3
包并确保其启用的简单情况。
要进行切换,只需编辑配置文件并添加或编辑以下行:
$_DVWA["SQLI_DB"] = "sqlite";$_DVWA["SQLITE_DB"] = "sqli.db";
默认情况下,它使用文件database/sqli.db
,如果你搞砸了,只需将database/sqli.db.dist
复制到顶部即可。
挑战与 MySQL 完全相同,只是针对 SQLite3 运行。
感谢您的所有贡献并保持该项目的更新。
如果您有想法、某种改进或只是想合作,欢迎您贡献并参与该项目,请随时发送您的 PR。
简而言之,请不要!
大约一年一次,有人会针对他们在应用程序中发现的漏洞提交一份报告,有些写得很好,有时比我在付费笔测试报告中看到的更好,有些只是“你缺少标题,请付费”我”。
2023 年,当有人决定请求针对其中一个漏洞的 CVE 时,这一情况提升到了一个全新的水平,他们获得了 CVE-2023-39848。随之而来的是很多欢闹,并且浪费了时间来纠正这个问题。
该应用程序存在漏洞,这是故意的。大多数是有详细记录的,您可以作为课程来学习,其他的是“隐藏”的,需要您自己找到。如果您确实想展示您寻找隐藏附加功能的技能,请撰写博客文章或创建视频,因为可能有人有兴趣了解它们以及您如何找到它们。如果您向我们发送链接,我们甚至可能将其包含在参考文献中。
项目主页:https://github.com/digininja/DVWA
由 DVWA 团队创建