0x01 关于 DAMN VULNERABLE WEB APPLICATION(DVWA)
Damn Vulnerable Web Application (DVWA)(译注:可以直译为:"糟糕的"不安全Web应用程序),是一个编码差的、易受攻击的 PHP/MySQL Web应用程序。 它的主要目的是帮助信息安全专业人员在合法的环境中,练习技能和测试工具,帮助 Web 开发人员更好地了解如何加强 Web 应用程序的安全性,并帮助学生和教师在可控的教学环境中了解和学习 Web 安全技术。DVWA的目的是通过简单明了的界面来练习一些最常见的 Web 漏洞,所练习的漏洞具有不同的难度级别。请注意,此软件存在提示和无提示的漏洞。这是特意为止。我们鼓励您依靠自己的能力尝试并发现尽可能多的安全问题。
警告!
DVWA非常容易被攻击!不要将其上传到您的云服务器上对外公开的 web 文件夹中或任何在公网中的web服务器上,否则服务器可能会被攻击。 建议使用虚拟机安装DVWA(如VirtualBox
或VMware
),网络配置为NAT组网。若在windows客户机(guest machine)中,您可以下载并安装 XAMPP 用作搭建DVWA的 Web 服务和数据库服务。
免责声明
我们不对任何人使用此应用程序 (DVWA) 的方式负责。 我们已经明确了应用程序的目的,该程序以及相关技术不应被恶意使用。 我们已警告并采取相关措施阻止用户将 DVWA 安装到生产环境的 Web 服务器上。 如果您的 Web 服务器因安装 DVWA 而被攻击,这不是我们的责任,而是由上传和安装它的人负责。
0x02 开始安装
- 运行
docker version
和docker compose version
,查看是否正确安装了Docker和Docker Compose。您应该能够在输出中看到它们的版本。
bash
>>> 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,但唯一支持的版本是来自官方GitHub存储库的最新源代码。您可以从repo中克隆它:
bash
git clone https://github.com/digininja/DVWA.git
或者下载文件的ZIP(https://github.com/digininja/DVWA/archive/master.zip
)。
- 打开您选择的终端并将其工作目录更改为此文件夹(
DVWA
)。 - 运行
docker compose up -d
。
DVWA现已在http://localhost:4280中运行。
请注意,在容器中运行DVWA时,Web服务器侦听的是端口4280,而不是通常的端口80。 有关端口设置的详细信息,请参考下文配置DVWA。
0x03 配置 DVWA
1. Config文件
DVWA附带了其配置文件的虚拟副本,您需要将其复制到位,然后进行适当的更改。在Linux上,假设您位于DVWA目录中,可以按如下方式执行此操作:
bash
cp config/config.inc.php.dist config/config.inc.php
2. 数据库设置
要设置数据库,只需单击主菜单中的Setup DVWA
按钮,然后单击Create / Reset Database
按钮。这将为您创建/重置数据库,其中包含一些数据。
如果您在尝试创建数据库时收到错误,请确保您的数据库凭据在./config/config.inc.php
中正确。这与config.inc.php.dist
不同,后者是一个示例文件。
默认情况下,变量设置如下:
bash
$_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(MariaDB是Kali中的默认值),那么你不能使用数据库root用户,你必须创建一个新的数据库用户。要执行此操作,请以root用户身份连接到数据库,然后使用以下命令:
bash
mysql> create database dvwa;
Query OK, 1 row affected (0.00 sec)
mysql> create user dvwa@localhost identified by 'p@ssw0rd';
Query OK, 0 rows affected (0.01 sec)
mysql> grant all on dvwa.* to dvwa@localhost;
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
3. 禁用身份验证
有些工具没有很好的身份验证功能,因此不能用于DVWA测试。为了解决这个问题,有一个配置选项可以禁用身份验证检查。要做到这一点,只需在配置文件中设置以下内容:
bash
$_DVWA[ 'disable_authentication' ] = true;
您还需要将安全级别设置为适合您要执行的测试的级别:
bash
$_DVWA[ 'default_security_level' ] = 'low';
在这种状态下,您可以访问所有功能,而无需登录并设置任何Cookie。
4. 文件夹权限
./hackable/uploads/
-需要可由Web服务写入(用于文件上传)。
5. PHP配置
在Linux系统上,可在/etc/php/x.x/fpm/php.ini
或/etc/php/x.x/apache2/php.ini
中找到配置文件。
要允许远程文件包含(RFI),请执行以下操作:
allow_url_include = on
[allow_url_include]
allow_url_fopen = on
[allow_url_fopen]
确保PHP显示所有错误消息:
display_errors = on
[display_errors]
display_startup_errors = on
[display_startup_errors]
请确保在进行更改后重新启动php服务或Apache。
6. reCAPTCHA
这是只需要为"不安全的验证码"实验设置。已从https://www.google.com/recaptcha/admin/create
生成一对API密钥。然后,这些将在./config/config.inc.php
的以下部分中进行设置:
bash
$_DVWA[ 'recaptcha_public_key' ]
$_DVWA[ 'recaptcha_private_key' ]
如果连接不上,检查你的网络。
7. 默认登录凭证
默认用户名= admin
默认密码= password
登录网址:http://127.0.0.1/login.php
注意:如果您将DVWA安装到不同的目录中,则情况会有所不同。
0x04 故障排除
这些假设你是基于Debian的发行版,如Debian,Ubuntu和Kali。对于其他发行版,请在适当的地方更新命令。
1. 容器
想查看日志
如果您使用Docker Desktop,则可以从图形应用程序访问日志。 一些小细节可能会随着新版本而改变,但访问方法应该是相同的。
也可以从终端访问。打开一个终端并将其工作目录更改为DVWA,显示合并的日志:
bash
docker compose logs
如果您想将日志导出到文件中,例如dvwa.log
bash
docker compose logs >dvwa.log
想在不同的端口上运行DVWA
默认情况下我们不使用端口80,原因如下:
有些用户可能已经在端口80上运行了一些东西。
一些用户可能使用无根容器引擎(如Podman),80是特权端口(1024)。需要额外的配置(例如设置net.ipv4.ip_unprivileged_port_start
),但须自行研究。
可以通过更改compose.yml
文件中的端口绑定在不同的端口上公开DVWA。 例如,可以更改
bash
ports:
- 4280:80
到
bash
ports:
- 8806:80
DVWA现在可以在http://localhost:8806
访问。
Docker运行时DVWA自动启动
包含的compose.yml
文件在Docker启动时自动运行DVWA及其数据库。
要禁用此功能,您可以删除或注释掉restart: unless-stopped
文件中的compose.yml
行。
如果想暂时禁用此行为,可以运行docker compose stop
,或使用Docker Desktop,找到dvwa并单击Stop。 此外,您可以删除容器,或运行docker compose down
。
2. 日志文件
在Linux系统上,Apache默认生成两个日志文件,access.log
和error.log
,而在基于Debian的系统上,它们通常位于/var/log/apache2/
中。当检查错误报告,问题,任何类似的,请检查这些文件。在基于Debian的系统上,你可以像这样得到这些:
bash
tail -n 5 /var/log/apache2/access.log /var/log/apache2/error.log
3. 浏览了一下网站,得到了404
如果你有这个问题,你需要了解文件的位置。默认情况下,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:
bash
http://localhost/MyDir/hello.txt
http://localhost/mydir/Hello.txt
http://localhost/MYDIR/hello.txt
大多数人使用git将DVWA导出到/var/www/html
,这会给他们目录/var/www/html/DVWA/
,其中包含所有DVWA文件。然后他们浏览到http://localhost/
并获得404或默认Apache欢迎页面。由于这些文件位于DVWA中,因此您必须浏览到http://localhost/DVWA
。
因此,在安装之后,如果您尝试访问站点并获得404,请考虑您将文件安装到的位置,它们相对于文档根的位置以及您使用的目录的情况。
4. "Access denied"运行安装程序
如果您在运行安装脚本时看到以下内容,则意味着配置文件中的用户名或密码与数据库中配置的用户名或密码不匹配:
bash
Database Error #1045: Access denied for user 'notdvwa'@'localhost' (using password: YES).
错误是告诉你你正在使用用户名notdvwa。
下面的错误说明您将配置文件指向了错误的数据库。
bash
SQL: Access denied for user 'dvwa'@'localhost' to database 'notdvwa'
它表示您正在使用用户dvwa并尝试连接到数据库notdvwa。
首先要做的是仔细检查你认为你放在配置文件中的是什么。
如果它符合您的期望,接下来要做的就是检查您是否可以在命令行上以用户身份登录。假设您的数据库用户为dvwa
,密码为p@ssw0rd
,运行以下命令:
bash
mysql -u dvwa -pp@ssw0rd -D dvwa
注意:-p后面没有空格
如果您看到以下内容,则表明密码正确:
bash
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]>
因为你可以在命令行上连接,所以很可能是配置文件中有问题,仔细检查一下。
如果您看到以下内容,则表示您使用的用户名或密码错误。重复数据库设置步骤,并确保在整个过程中使用相同的用户名和密码。
bash
ERROR 1045 (28000): Access denied for user 'dvwa'@'localhost' (using password: YES)
如果出现以下情况,则用户凭据是正确的,但用户没有访问数据库的权限。再次重复设置步骤并检查您正在使用的数据库名称。
bash
ERROR 1044 (42000): Access denied for user 'dvwa'@'localhost' to database 'dvwa'
你可能得到的最后一个错误是这样的:
bash
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
这不是身份验证问题,而是告诉您数据库服务没有运行。按以下内容开启
bash
sudo service mysql start
5. 未知身份验证方法Unknown authentication method
在最新版本的MySQL中,PHP不能再与默认配置中的数据库对话。如果您尝试运行安装脚本并获得以下消息,则意味着您已配置。
bash
Database Error #2054: The server requested authentication method unknown to the client.
有两个选择,最简单的是卸载MySQL并安装MariaDB。以下是MariaDB项目的官方指南:
bash
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
在第1行下,添加以下内容: [mysqld
]
重新启动数据库:sudo service mysql restart
检查数据库用户的身份验证方法:
bash
mysql> select Host,User, plugin from mysql.user where mysql.user.User = 'dvwa';
+-----------+------------------+-----------------------+
| Host | User | plugin |
+-----------+------------------+-----------------------+
| localhost | dvwa | caching_sha2_password |
+-----------+------------------+-----------------------+
1 rows in set (0.00 sec)
你可能会看到caching_sha2_password
。如果这样,运行以下命令:
bash
mysql> ALTER USER dvwa@localhost IDENTIFIED WITH mysql_native_password BY 'p@ssw0rd';
重新运行检查,您现在应该看到mysql_native_password
。
bash
mysql> select Host,User, plugin from mysql.user where mysql.user.User = 'dvwa';
+-----------+------+-----------------------+
| Host | User | plugin |
+-----------+------+-----------------------+
| localhost | dvwa | mysql_native_password |
+-----------+------+-----------------------+
1 row in set (0.00 sec)
在所有这一切之后,设置过程现在应该正常工作。
如果您想了解更多信息,请参阅以下页面:https://www.php.net/manual/en/mysqli.requirements.php
。
6. 数据库错误#2002:没有这样的文件或目录(Database Error #2002: No such file or directory
.)。
数据库服务器未运行。在基于Debian的发行版中,这可以通过以下方式完成:
css
sudo service mysql start
7. 错误"MySQL服务器已经断开"和"数据包的乱序"(MySQL server has gone away)(Packets out of order)
有几个原因可能会导致这些错误,但最有可能的是您运行的数据库服务器版本与PHP版本不兼容。
这是最常见的,当你为PHP运行最新版本的MySQL作数据库,它没有得到很好兼容。最好的建议,抛弃MySQL并安装MariaDB。
有关详细信息,请参阅:
bash
https://www.ryadel.com/en/fix-mysql-server-gone-away-packets-order-similar-mysql-related-errors/
8. 命令注入不起作用
Apache可能没有足够高的权限在Web服务器上运行命令。如果您在Linux下运行DVWA,请确保以root身份登录。在Windows下以管理员身份登录。
9. 为什么数据库不能在CentOS上连接?
可能会遇到SELinux的问题。 禁用SELinux或运行此命令以允许Web服务器与数据库对话:
bash
setsebool -P httpd_can_network_connect_db 1
10. 其他排查
对比操作系统
任何错误发生之后,检查Web服务器错误日志的最后5行
如果是数据库身份验证问题,请执行上述步骤并对每个步骤检查。沿着配置文件中显示数据库用户和密码的部分的检查。
一个完整检查是什么出了问题,思考你已经尝试做了什么来修复它。
11. SQLite3
默认情况下,SQLi和Blind SQLi是针对网站使用的MariaDB/MySQL
服务器进行的,但也可以切换到针对SQLite3
进行SQLi测试。
我不打算介绍如何让SQLite3与PHP一起工作,但它应该是一个安装php-sqlite3
包并确保它被启用的简单案例。
要进行切换,只需编辑配置文件并添加或编辑以下行:
bash
$_DVWA["SQLI_DB"] = "sqlite";
$_DVWA["SQLITE_DB"] = "sqli.db";
默认情况下,它使用文件database/sqli.db
,如果出现错误了,只需复制database/sqli.db.dist
重新覆盖初始设置。
实验与MySQL完全相同,它们只是针对SQLite3运行。