
# Damn Vulnerable Web Application 

Damn Vulnerable Web Application (DVWA) — это веб-приложение на PHP/MariaDB, которое является чертовски уязвимым. Его основная цель — помочь специалистам по безопасности проверить свои навыки и инструменты в легальной среде, помочь веб-разработчикам лучше понять процессы обеспечения безопасности веб-приложений и помочь как студентам, так и преподавателям изучить вопросы безопасности веб-приложений в контролируемой среде класса.

Цель DVWA — **отработать некоторые из наиболее распространенных уязвимостей веб-приложений** с **различными уровнями сложности** с помощью простого и понятного интерфейса.
Обратите внимание, что в этом программном обеспечении есть **как задокументированные, так и незадокументированные уязвимости**. Это сделано намеренно. Мы призываем вас попробовать обнаружить как можно больше проблем.
- - -

## ВНИМАНИЕ!

Damn Vulnerable Web Application действительно очень уязвимо! **Не загружайте его в общедоступную папку html вашего хостинг-провайдера или на любой сервер, подключенный к Интернету**, так как они будут скомпрометированы. Рекомендуется использовать виртуальную машину (такую как [VirtualBox](https://www.virtualbox.org/) или [VMware](https://www.vmware.com/)), настроенную в режиме NAT. Внутри гостевой машины вы можете загрузить и установить [XAMPP](https://www.apachefriends.org/) для веб-сервера и базы данных.

### Отказ от ответственности

Мы не несем ответственности за то, как кто-либо использует это приложение (DVWA). Мы четко указали цели приложения, и оно не должно использоваться в злонамеренных целях. Мы предоставили предупреждения и приняли меры, чтобы пользователи не устанавливали DVWA на действующие веб-серверы. Если ваш веб-сервер будет скомпрометирован в результате установки DVWA, это не будет нашей ответственностью, а ответственностью лица/лиц, которые загрузили и установили его.

- - -

## Лицензия

Этот файл является частью Damn Vulnerable Web Application (DVWA).

Damn Vulnerable Web Application (DVWA) является бесплатным программным обеспечением: вы можете распространять и/или изменять
его в соответствии с условиями общественной лицензии GNU, опубликованной
Free Software Foundation, либо версии 3 лицензии, либо
(по вашему усмотрению) любой более поздней версии.

Damn Vulnerable Web Application (DVWA) распространяется в надежде, что оно будет полезно,
но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
ПРИГОДНОСТИ ДЛЯ ПРОДАЖИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ.  См.
GNU General Public License.

Вы должны были получить копию общественной лицензии GNU
вместе с Damn Vulnerable Web Application (DVWA).  Если нет, см. <https://www.gnu.org/licenses/>.

- - -

## Интернационализация

Этот файл доступен на нескольких языках:

- Арабский: [العربية](README.ar.md)
- Китайский: [简体中文](README.zh.md)
- Французский: [Français](README.fr.md)
- Корейский: [한국어](README.ko.md)
- Персидский: [فارسی](README.fa.md)
- Польский: [Polski](README.pl.md)
- Португальский: [Português](README.pt.md)
- Испанский: [Español](README.es.md)
- Турецкий: [Türkçe](README.tr.md)
- Индонезийский: [Indonesia](README.id.md)
- Вьетнамский: [Vietnamese](README.vi.md)
- Итальянский: [Italiano](README.it.md)
- Украинский: [Українська](README.uk.md)

Если вы хотите внести свой вклад в перевод, отправьте PR. Обратите внимание, что это не означает, что нужно просто перевести текст через Google Translate и отправить его, такие переводы будут отклонены. Отправьте свой перевод, добавив новый файл «README.xx.md», где xx — двухбуквенный код желаемого языка (в соответствии с [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)).

- - -

## Скачать

Хотя существует несколько версий DVWA, единственной поддерживаемой версией является последняя версия из официального репозитория GitHub. Вы можете клонировать ее из репозитория:

```sh
git clone https://github.com/digininja/DVWA.git
```

Или [скачать ZIP-архив с файлами](https://github.com/digininja/DVWA/archive/master.zip).

- - -

## Установка

### Автоматическая установка 🛠️

**Обратите внимание, что это не официальный скрипт DVWA, он был написан [IamCarron](https://github.com/iamCarron/). На создание скрипта было затрачено много времени, и на момент создания он не выполнял никаких вредоносных действий, однако на всякий случай рекомендуется проверить скрипт, прежде чем слепо запускать его в своей системе. Пожалуйста, сообщайте о любых ошибках [IamCarron](https://github.com/iamCarron/), а не здесь.**

Автоматический скрипт настройки DVWA для машин на базе Debian, включая Kali, Ubuntu, Kubuntu, Linux Mint, Zorin OS...

**Примечание: этот скрипт требует прав root и предназначен для систем на базе Debian. Убедитесь, что вы запускаете его как пользователь root.**

#### Требования к установке

- **Операционная система:** система на базе Debian (Kali, Ubuntu, Kubuntu, Linux Mint, Zorin OS)
- **Права:** Выполнение от имени пользователя root

#### Шаги по установке

##### Однострочный

Это позволит загрузить скрипт установки, написанный [@IamCarron](https://github.com/IamCarron), и запустить его автоматически. Мы бы не включили его сюда, если бы не доверяли автору и скрипту в том виде, в котором он был на момент проверки, но всегда есть вероятность, что кто-то может злоупотребить доверием, поэтому, если вы не чувствуете себя в безопасности, запуская чужой код без его предварительной проверки, следуйте инструкциям по ручной установке и проверьте его после загрузки.

```sh
sudo bash -c "$(curl --fail --show-error --silent --location https://raw.githubusercontent.com/IamCarron/DVWA-Script/main/Install-DVWA.sh)"
```

##### Запуск скрипта вручную

1. **Загрузите скрипт:**

   ```sh
   wget https://raw.githubusercontent.com/IamCarron/DVWA-Script/main/Install-DVWA.sh
   ```

2. **Сделайте скрипт исполняемым:**

   ```sh
   chmod +x Install-DVWA.sh
   ```

3. **Запустите скрипт от имени root:**

   ```sh
   sudo ./Install-DVWA.sh
   ```

### Видео по установке

- [Установка DVWA на Kali, работающей в VirtualBox](https://www.youtube.com/watch?v=WkyDxNJkgQ4)
- [Установка DVWA в Windows с помощью XAMPP](https://youtu.be/Yzksa_WjnY0)
- [Установка Damn Vulnerable Web Application (DVWA) в Windows 10](https://www.youtube.com/watch?v=cak2lQvBRAo)

### Windows + XAMPP

Самый простой способ установить DVWA — это загрузить и установить [XAMPP](https://www.apachefriends.org/), если у вас еще нет настроенного веб-сервера.

XAMPP — это очень простой в установке дистрибутив Apache для Linux, Solaris, Windows и Mac OS X. Пакет включает веб-сервер Apache, MySQL, PHP, Perl, FTP-сервер и phpMyAdmin.

Это [видео](https://youtu.be/Yzksa_WjnY0) проведет вас через процесс установки для Windows, но он должен быть аналогичным для других ОС.

### Docker

Благодаря [hoang-himself](https://github.com/hoang-himself) и [JGillam](https://github.com/JGillam), каждый коммит в ветку `master` приводит к созданию образа Docker, который можно загрузить из реестра контейнеров GitHub.

Для получения дополнительной информации о том, что вы получаете, вы можете просмотреть [готовые образы Docker](https://github.com/digininja/DVWA/pkgs/container/dvwa).

#### Начало работы

Необходимые условия: Docker и Docker Compose.

- Если вы используете Docker Desktop, оба эти компонента должны быть уже установлены.
- Если вы предпочитаете Docker Engine на Linux, обязательно следуйте [руководству по установке](https://docs.docker.com/engine/install/#server).

**Мы предоставляем поддержку для последней версии Docker, как показано выше.**
Если вы используете Linux и пакет Docker, поставляемый с вашим менеджером пакетов, он, вероятно, тоже будет работать, но поддержка будет предоставляться только по мере возможности.

Для обновления Docker с версии из пакетного менеджера до версии из исходного репозитория необходимо удалить старые версии, как указано в руководствах для [Ubuntu](https://docs.docker.com/engine/install/ubuntu/#uninstall-old-versions), [Fedora](https://docs.docker.com/engine/install/fedora/#uninstall-old-versions) и других.
Ваши данные Docker (контейнеры, образы, тома и т. д.) не должны быть затронуты, но в случае возникновения проблем обязательно [сообщите об этом Docker](https://www.docker.com/support) и воспользуйтесь поисковыми системами.

Затем, чтобы начать:

1. Запустите `docker version` и `docker compose version`, чтобы проверить, правильно ли установлены Docker и Docker Compose. Вы должны увидеть их версии в выводе.

    Например:

    ```text
    >>> docker version
    Клиент:
     [...]
     Version:           23.0.5
     [...]

    Сервер: Docker Desktop 4.19.0 (106363)
     Движок:
      [...]
      Version:          23.0.5
      [...]

    >>> docker compose version
    Docker Compose version v2.17.3
    ```

    Если вы ничего не видите или получаете ошибку «команда не найдена», выполните предварительные требования для настройки Docker и Docker Compose.

2. Клонируйте или загрузите этот репозиторий и извлеките его (см. [Загрузка](#download)).
3. Откройте терминал по вашему выбору и измените его рабочий каталог на эту папку (`DVWA`).
4. Запустите `docker compose up -d`.

DVWA теперь доступен по адресу `http://localhost:4280`.

**Обратите внимание, что для запуска DVWA в контейнерах веб-сервер прослушивает порт 4280 вместо обычного порта 80.**
Для получения дополнительной информации об этом решении см. [Я хочу запустить DVWA на другом порту](#i-want-to-run-dvwa-on-a-different-port).

#### Локальная сборка

Если вы внесли локальные изменения и хотите скомпилировать проект локально, перейдите в `compose.yml` и измените `pull_policy: always` на `pull_policy: build`.

Запуск `docker compose up -d` должен запустить Docker для сборки образа из локальной системы, независимо от того, что доступно в реестре.

См. также: [`pull_policy`](https://github.com/compose-spec/compose-spec/blob/master/05-services.md#pull_policy).

#### Обслуживание локальных файлов

Если вы вносите локальные изменения и не хотите создавать проект при каждом изменении:
1. Перейдите в `compose.yml` и удалите комментарий:
    ```
        # volumes:
        #   - ./:/var/www/html
    ```
2. Запустите `cp config/config.inc.php.dist config/config.inc.php`, чтобы скопировать файл конфигурации по умолчанию.
3. Запустите `docker compose up -d`, и изменения в локальных файлах отразятся в контейнере.

### Версии PHP

В идеале вы должны использовать последнюю стабильную версию PHP, так как именно на этой версии будет разработано и протестировано данное приложение.

Поддержка не будет предоставляться тем, кто пытается использовать PHP 5.x.

В версиях ниже 7.3 есть известные проблемы, которые могут вызвать сбои в работе. Большая часть приложения будет работать, но некоторые функции могут не работать. Если у вас нет веских причин для использования такой старой версии, поддержка не будет предоставляться.

### Пакеты Linux

Если вы используете дистрибутив Linux на основе Debian, вам необходимо установить следующие пакеты _(или их эквиваленты)_:

- apache2
- libapache2-mod-php
- mariadb-server
- mariadb-client
- php php-mysqli
- php-gd

Я бы порекомендовал перед этим выполнить обновление, чтобы убедиться, что у вас установлены последние версии всех компонентов.

```sh
apt update
apt install -y apache2 mariadb-server mariadb-client php php-mysqli php-gd libapache2-mod-php
```

Сайт будет работать с MySQL вместо MariaDB, но мы настоятельно рекомендуем MariaDB, так как она работает сразу после установки, в то время как для правильной работы MySQL необходимо внести изменения.

### Модули Apache

Если вы хотите использовать API lab, у вас должен быть включен модуль Apache `mod_rewrite`. Для этого в Linux выполните:

```
a2enmod rewrite
```

Затем перезапустите Apache с помощью команды:

```
apachectl restart
```

### Файлы поставщика

Если вы хотите использовать модуль API, вам необходимо установить набор файлов поставщика с помощью [Composer](https://getcomposer.org/).

Сначала убедитесь, что у вас установлен Composer. Похоже, есть проблемы с обратной совместимостью, поэтому я всегда беру последнюю версию отсюда:

https://getcomposer.org/doc/00-intro.md

Следуйте инструкциям на сайте, чтобы установить его.

Теперь перейдите в каталог `vulnerabilities/api` и запустите:

```
composer.phar install
```

Если вы не установили Composer в системный путь, убедитесь, что указали его полное расположение.

## Настройки

### Файл конфигурации

DVWA поставляется с фиктивной копией своего файла конфигурации, которую вам необходимо скопировать в нужное место, а затем внести соответствующие изменения. В Linux, предполагая, что вы находитесь в каталоге DVWA, это можно сделать следующим образом:

`cp config/config.inc.php.dist config/config.inc.php`

В Windows это может быть немного сложнее, если вы скрываете расширения файлов. Если вы не уверены в этом, в этой статье блога объясняется более подробно:

[Как заставить Windows показывать расширения файлов](https://www.howtogeek.com/205086/beginner-how-to-make-windows-show-file-extensions/)

### Настройка с помощью переменных среды

Вместо изменения файла конфигурации вы также можете установить большинство настроек с помощью переменных среды. При развертывании в Docker или Kubernetes это позволяет изменять конфигурацию без создания нового образа Docker. Переменные находятся в файле [config/config.inc.php.dist](config/config.inc.php.dist).

Если вы хотите установить уровень безопасности по умолчанию на «низкий», просто добавьте следующую строку в файл [compose.yml](./compose.yml):

```yml
environment:
  - DB_SERVER=db
  - DEFAULT_SECURITY_LEVEL=low
```

### Настройка базы данных

Чтобы настроить базу данных, просто нажмите кнопку «Setup DVWA» (Настройка DVWA) в главном меню, а затем нажмите кнопку «Create / Reset Database» (Создать / Сбросить базу данных). Это создаст / сбросит базу данных с некоторыми данными.

Если при попытке создать базу данных вы получили сообщение об ошибке, убедитесь, что ваши учетные данные для базы данных в файле `./config/config.inc.php` верны. _Это отличается от config.inc.php.dist, который является примером файла._

По умолчанию переменные установлены следующим образом:

```php
$_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, затем выполните следующие команды:

```mariadb
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. Чтобы обойти эту проблему, существует опция конфигурации, позволяющая отключить проверку аутентификации. Для этого просто установите следующее в файле конфигурации:

```php
$_DVWA[ 'disable_authentication' ] = true;
```

Вам также необходимо будет установить уровень безопасности, соответствующий тестированию, которое вы хотите провести:

```php
$_DVWA[ 'default_security_level' ] = 'low';
```

В этом состоянии вы можете получить доступ ко всем функциям без необходимости входа в систему и установки каких-либо файлов cookie.

### Разрешения для папок

- `./hackable/uploads/` - Должна быть доступна для записи веб-службой (для загрузки файлов).

### Конфигурация PHP

В системах Linux, вероятно, находится в `/etc/php/x.x/fpm/php.ini` или `/etc/php/x.x/apache2/php.ini`.

- Чтобы разрешить  удаленное включение файлов (RFI):
  - `allow_url_include = on` [[allow_url_include](https://secure.php.net/manual/en/filesystem.configuration.php#ini.allow-url-include)]
  - `allow_url_fopen = on` [[allow_url_fopen](https://secure.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen)]

- Чтобы PHP отображал все сообщения об ошибках:
  - `display_errors = on` [[display_errors](https://secure.php.net/manual/en/errorfunc.configuration.php#ini.display-errors)]
  - `display_startup_errors = on` [[display_startup_errors](https://secure.php.net/manual/en/errorfunc.configuration.php#ini.display-startup-errors)]

Обязательно перезапустите службу php или Apache после внесения изменений.

### reCAPTCHA

Это требуется только для лабораторной работы «Небезопасная CAPTCHA». Если вы не занимаетесь этой лабораторной работой, можете пропустить этот раздел.

Сгенерируйте пару ключей API на сайте <https://www.google.com/recaptcha/admin/create>.

Затем вставьте их в следующие разделы файла `./config/config.inc.php`:

- `$_DVWA[ 'recaptcha_public_key' ]`
- `$_DVWA[ 'recaptcha_private_key' ]`

### Учетные данные по умолчанию

**Имя пользователя по умолчанию = `admin`**

**Пароль по умолчанию = `password`**

_...легко поддаются брутфорсу ;)_

URL для входа: <http://127.0.0.1/login.php>

_Примечание: этот адрес будет другим, если вы установили DVWA в другой каталог._

- - -

## Устранение неполадок

Предполагается, что вы используете дистрибутив на базе Debian, такой как Debian, Ubuntu и Kali. Для других дистрибутивов следуйте инструкциям, но обновите команду там, где это необходимо.

Если вы предпочитаете смотреть видео, а не читать текст, самые распространенные проблемы описаны в видео [Устранение проблем с настройкой DVWA](https://youtu.be/C-kig5qrPSA?si=_a4Bop505-1tXb_F).

### Контейнеры

#### Я хочу получить доступ к журналам

Если вы используете Docker Desktop, доступ к журналам можно получить из графического приложения.
Некоторые мелкие детали могут измениться в более новых версиях, но способ доступа должен остаться прежним.

![Обзор DVWA compose](./docs/graphics/docker/overview.png)
![Просмотр журналов DVWA](docs/graphics/docker/detail.png)

Доступ к журналам также можно получить из терминала.

1. Откройте терминал и измените его рабочий каталог на DVWA
2. Отобразите объединенные журналы

    ```sh
    docker compose logs
    ```

   Если вы хотите экспортировать журналы в файл, например `dvwa.log`

   ```sh
   docker compose logs > dvwa.log
   ```

#### Я хочу запустить DVWA на другом порту

Мы не используем порт 80 по умолчанию по нескольким причинам:

- Некоторые пользователи могут уже запускать что-то на порту 80.
- Некоторые пользователи могут использовать контейнерный движок без прав root (например, Podman), а 80 является привилегированным портом (< 1024). Требуется дополнительная настройка (например, установка `net.ipv4.ip_unprivileged_port_start`), но вам придется самостоятельно изучить этот вопрос.

Вы можете открыть DVWA на другом порту, изменив привязку порта в файле `compose.yml`.
Например, вы можете изменить

```yml
ports:
  - 127.0.0.1:4280:80
```

на

```yml
ports:
  - 127.0.0.1:8806:80
```

DVWA теперь доступен по адресу `http://localhost:8806`.

В случаях, когда вы хотите, чтобы DVWA был доступен не только с вашего собственного устройства, но
и в локальной сети (например, потому что вы настраиваете тестовую машину для семинара), вы
вы можете удалить `127.0.0.1:` из сопоставления портов (или заменить его IP-адресом вашей локальной сети). Таким образом, он
будет прослушивать все доступные устройства. Безопасным по умолчанию всегда должно быть прослушивание только вашего
локальное устройство обратной связи. В конце концов, это чертовски уязвимое веб-приложение, работающее на вашем компьютере.

#### DVWA запускается автоматически при запуске Docker

Включенный файл [`compose.yml`](./compose.yml) автоматически запускает DVWA и его базу данных при запуске Docker.

Чтобы отключить эту функцию, вы можете удалить или закомментировать строки `restart: unless-stopped` в файле [`compose.yml`](./compose.yml).

Если вы хотите временно отключить это поведение, вы можете запустить `docker compose stop` или использовать Docker Desktop, найти `dvwa` и нажать «Stop».
Кроме того, вы можете удалить контейнеры или запустить `docker compose down`.

### Файлы журналов

В системах Linux Apache по умолчанию генерирует два файла журнала, `access.log` и `error.log`, а в системах на базе Debian они обычно находятся в `/var/log/apache2/`.

При отправке отчетов об ошибках, проблемах и т. п. пожалуйста, включайте в них как минимум последние пять строк из каждого из этих файлов. В системах на базе Debian их можно получить следующим образом:

```sh
tail -n 5 /var/log/apache2/access.log /var/log/apache2/error.log
```

### Я перешел на сайт и получил ошибку 404 или страницу по умолчанию Apache2

[Видео-справка](https://youtu.be/C-kig5qrPSA?si=wTS3Aj8fycW3Idfr&t=141)

Если у вас возникла эта проблема, вам необходимо понять расположение файлов. По умолчанию корневой каталог Apache (место, где он начинает искать веб-контент) находится в `/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`, поскольку `dvwa` не является `DVWA` с точки зрения сопоставления каталогов Linux.

Поэтому после настройки, если вы пытаетесь посетить сайт и получаете ошибку `404`, подумайте, куда вы установили файлы, где они находятся по отношению к корню документов и каков регистр используемого вами каталога.

### Я перешел на сайт и получил пустой экран

[Видео-справка](https://youtu.be/C-kig5qrPSA?si=wTS3Aj8fycW3Idfr&t=243)

Обычно это одна проблема конфигурации, скрывающая другую проблему. По умолчанию PHP не отображает ошибки, поэтому, если вы забыли включить отображение ошибок во время процесса настройки, любые другие проблемы, такие как сбой подключения к базе данных, остановят загрузку приложения, но сообщение о том, что не так, будет скрыто.

Чтобы исправить это, убедитесь, что вы установили `display_errors` и `display_startup_errors`, как описано в [Конфигурация PHP](#php-configuration), а затем перезапустите Apache.

### «Доступ запрещен» при запуске установки

Если при запуске скрипта установки вы видите следующее сообщение, это означает, что имя пользователя или пароль в файле конфигурации не совпадают с теми, которые настроены в базе данных. [Видео-справка](https://youtu.be/C-kig5qrPSA?si=_a4Bop505-1tXb_F&t=973)

```mariadb
Ошибка базы данных #1045: Доступ запрещен для пользователя 'notdvwa'@'localhost' (с использованием пароля: ДА).
```

Ошибка сообщает вам, что вы используете имя пользователя `notdvwa`.

Следующая ошибка означает, что вы указали в файле конфигурации неверную базу данных. [Видео-справка](https://youtu.be/C-kig5qrPSA?si=_a4Bop505-1tXb_F&t=630)

```mariadb
SQL: Доступ к базе данных 'notdvwa' для пользователя 'dvwa'@'localhost' запрещен
```

Это означает, что вы используете пользователя `dvwa` и пытаетесь подключиться к базе данных `notdvwa`.

Первое, что нужно сделать, — это дважды проверить, что то, что вы, по вашему мнению, ввели в файл конфигурации, действительно там есть.

Если все соответствует вашим ожиданиям, следующим шагом будет проверка возможности входа в систему с помощью этого пользователя в командной строке. Предполагая, что у вас есть пользователь базы данных `dvwa` и пароль `p@ssw0rd`, выполните следующую команду:

```sh
mysql -u dvwa -pp@ssw0rd -D dvwa
```

_Примечание: после -p_ нет пробела

Если вы видите следующее, пароль правильный:

```mariadb
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 и другие.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [dvwa]>
```

Поскольку вы можете подключиться через командную строку, вероятно, в конфигурационном файле есть ошибка. Проверьте его еще раз и, если проблема не устранена, сообщите о ней.

Если вы видите следующее, значит, вы используете неверное имя пользователя или пароль. Повторите шаги [Настройка базы данных](#database-setup) и убедитесь, что вы используете одно и то же имя пользователя и пароль на протяжении всего процесса.

```mariadb
ERROR 1045 (28000): Access denied for user 'dvwa'@'localhost' (using password: YES)
```

Если вы видите следующее сообщение, значит учетные данные пользователя верны, но у пользователя нет доступа к базе данных. Повторите шаги настройки и проверьте имя базы данных, которое вы используете.

```mariadb
ОШИБКА 1044 (42000): Access denied for user 'dvwa'@'localhost' to database 'dvwa'
```

Последней ошибкой, которую вы можете получить, является следующая:

```mariadb
ОШИБКА 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```

Это не проблема аутентификации, а сообщение о том, что сервер базы данных не работает. Запустите его с помощью следующей команды

```sh
sudo service mysql start
```

### Соединение отказано

[Видео-справка](https://youtu.be/C-kig5qrPSA?si=_a4Bop505-1tXb_F&t=444)

Ошибка, похожая на эту:

```mariadb
Fatal error: Uncaught mysqli_sql_exception: Connection refused in /var/sites/dvwa/non-secure/htdocs/dvwa/includes/dvwaPage.inc.php:535
```

Означает, что ваш сервер базы данных не работает или в файле конфигурации указан неверный IP-адрес.

Проверьте эту строку в файле конфигурации, чтобы увидеть, где должен находиться сервер базы данных:

```php
$_DVWA[ 'db_server' ]   = '127.0.0.1';
```

Затем перейдите на этот сервер и проверьте, работает ли он. В Linux это можно сделать с помощью:

```sh
systemctl status mariadb.service
```

Вы должны увидеть что-то подобное, главное, чтобы было указано «active (running)» (активен (работает)).

```sh
● mariadb.service - MariaDB 10.5.19 database server
     Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; preset: enabled)
     Active: active (running) since Thu 2024-03-14 16:04:25 GMT; 1 week 5 days ago
```

Если он не запущен, вы можете запустить его с помощью:

```sh
sudo systemctl stop mariadb.service 
```

Обратите внимание на `sudo` и убедитесь, что вы ввели свой пароль пользователя Linux, если он запрашивается.

В Windows проверьте статус в консоли XAMPP.

### Неизвестный метод аутентификации

В последних версиях MySQL, PHP больше не может взаимодействовать с базой данных в своей конфигурации по умолчанию. Если при попытке запустить скрипт настройки вы получаете следующее сообщение, это означает, что у вас есть конфигурация.

```mariadb
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/>

В качестве альтернативы выполните следующие действия:

1. Как root отредактируйте следующий файл: `/etc/mysql/mysql.conf.d/mysqld.cnf`
1. Под строкой `[mysqld]` добавьте следующее:
  `default-authentication-plugin=mysql_native_password`
1. Перезапустите базу данных: `sudo service mysql restart`
1. Проверьте метод аутентификации для пользователя базы данных:

    ```sql
    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)
    ```

1. Скорее всего, вы увидите `caching_sha2_password`. Если это так, выполните следующую команду:

    ```sql
    mysql> ALTER USER dvwa@localhost IDENTIFIED WITH mysql_native_password BY 'p@ssw0rd';
    ```

1. Повторно запустив проверку, вы должны увидеть `mysql_native_password`.

    ```sql
    mysql> select Host,User, plugin from mysql.user where mysql.user.User = 'dvwa';
    +-----------+------+-----------------------+
    | Host      | User | plugin                |
    +-----------+------+-----------------------+
    | localhost | dvwa | mysql_native_password |
    +-----------+------+-----------------------+
    1 rows in set (0.00 sec)
    ```

После всего этого процесс настройки должен работать в обычном режиме.

Если вам нужна дополнительная информация, см. следующую страницу: <https://www.php.net/manual/en/mysqli.requirements.php>.

### Ошибка базы данных #2002: Такого файла или каталога нет

Сервер базы данных не работает. В дистрибутиве на основе Debian это можно сделать с помощью:

```sh
sudo service mysql start
```

### Ошибки «MySQL server has gone away» и «Packets out of order»

Есть несколько причин, по которым могут возникать эти ошибки, но наиболее вероятная из них — версия сервера базы данных, которую вы используете, несовместима с версией PHP.

Чаще всего это происходит, когда вы используете последнюю версию MySQL в качестве PHP, и они не совместимы. Лучший совет — отказаться от MySQL и установить MariaDB, так как мы не можем обеспечить поддержку данной версии.

Для получения дополнительной информации см.:

<https://www.ryadel.com/en/fix-mysql-server-gone-away-packets-order-similar-mysql-related-errors/>

### Почему база данных не может подключиться к CentOS?

Возможно, у вас возникли проблемы с SELinux.  Отключите SELinux или выполните эту команду, чтобы веб-сервер мог обмениваться данными с базой данных:

```sh
setsebool -P httpd_can_network_connect_db 1
```

### MariaDB Docker не запускается

Если при попытке запустить MariaDB в журналах Docker появляется следующая ошибка, вероятно, это связано с недостатком памяти на хост-машине. Если вы используете эту программу в хостинговой среде, лучшим решением будет увеличить размер машины, чтобы получить больше памяти, и повторить попытку.

```
[Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:10.11.15+maria~ubu2204 started.
[Warn] [Entrypoint]: /sys/fs/cgroup///memory.pressure not writable, functionality unavailable to MariaDB
```

Возможно, вам также потребуется добавить следующую строку в раздел volumes вашего файла `compose.yml`:

```
- /sys/fs/cgroup/memory.pressure:/sys/fs/cgroup/memory.pressure
```

В результате раздел volumes файла конфигурации по умолчанию будет изменен следующим образом:

```
     volumes:
       - dvwa:/var/lib/mysql
       - /sys/fs/cgroup/memory.pressure:/sys/fs/cgroup/memory.pressure
```

Для получения дополнительной информации о том, почему это работает, см. [эту проблему](https://github.com/MariaDB/mariadb-docker/issues/626).

### Что-нибудь еще

Для получения последней информации по устранению неполадок прочитайте открытые и закрытые заявки в репозитории git:

<https://github.com/digininja/DVWA/issues>

Перед отправкой заявки убедитесь, что вы используете последнюю версию кода из репозитория. Это не последняя версия, а последний код из основной ветки.

При создании заявки, пожалуйста, предоставьте как минимум следующую информацию:

- Операционная система
- Последние 5 строк из журнала ошибок веб-сервера, непосредственно следующие за ошибкой, о которой вы сообщаете
- Если это проблема с аутентификацией базы данных, выполните описанные выше шаги и сделайте скриншоты каждого шага. Отправьте их вместе со скриншотом раздела конфигурационного файла, в котором указаны имя пользователя и пароль базы данных.
- Полное описание того, что не работает, что вы ожидаете, и что вы пытались сделать, чтобы исправить это. «Не работает вход» — это недостаточно, чтобы мы могли понять вашу проблему и помочь ее исправить.

- - -

## Учебные материалы

Я постараюсь собрать несколько обучающих видео, в которых будут рассмотрены некоторые уязвимости, показано, как их обнаружить, а затем как их использовать. Вот те, которые я сделал до сих пор:

[Обнаружение и использование отраженного XSS](https://youtu.be/V4MATqtdxss)

- -

## SQL-инъекции в SQLite3

_Поддержка этой функции ограничена, прежде чем поднимать вопросы, убедитесь, что вы готовы работать над отладкой, а не просто заявлять, что «это не работает»._

По умолчанию SQLi и Blind SQLi выполняются на сервере MariaDB/MySQL, используемом сайтом, но можно переключиться на тестирование SQLi на SQLite3.

Я не буду рассказывать, как заставить SQLite3 работать с PHP, но это должно быть просто: нужно установить пакет `php-sqlite3` и убедиться, что он включен.

Чтобы выполнить переключение, просто отредактируйте файл конфигурации и добавьте или отредактируйте следующие строки:

```php
$_DVWA["SQLI_DB"] = "sqlite";
$_DVWA["SQLITE_DB"] = "sqli.db";
```

По умолчанию используется файл `database/sqli.db`. Если вы что-то испортили, просто скопируйте файл `database/sqli.db.dist` поверх него.

Задачи точно такие же, как и для MariaDB, только выполняются в SQLite3.

- - -

👨‍💻 Участники
-----

Спасибо за все ваши вклады и за то, что поддерживаете этот проект в актуальном состоянии. :heart:

Если у вас есть идеи, предложения по улучшению или вы просто хотите сотрудничать, приглашаем вас принять участие в проекте, не стесняйтесь присылать свои PR.

<p align="center">
<a href="https://github.com/digininja/DVWA/graphs/contributors">
  <img src="https://contrib.rocks/image?repo=digininja/DVWA&max=500">
</a>
</p>

- - -

## Сообщение об уязвимостях

Проще говоря, пожалуйста, не делайте этого!

Примерно раз в год кто-нибудь отправляет отчет об уязвимости, которую он обнаружил в приложении. Некоторые отчеты написаны хорошо, иногда даже лучше, чем те, что я видел в платных отчетах о тестировании на проникновение, а некоторые просто гласят: «У вас отсутствуют заголовки, заплатите мне».

В 2023 году это вышло на совершенно новый уровень, когда кто-то решил запросить CVE для одной из уязвимостей, и ему был присвоен номер [CVE-2023-39848](https://nvd.nist.gov/vuln/detail/CVE-2023-39848). Это вызвало много веселья, и было потрачено много времени на исправление этой ситуации.

Приложение имеет уязвимости, и это сделано намеренно. Большинство из них хорошо задокументированы, и вы можете проработать их в качестве уроков, другие же являются «скрытыми» и их нужно найти самостоятельно. Если вы действительно хотите продемонстрировать свои навыки в поиске скрытых бонусов, напишите пост в блоге или создайте видео, так как, вероятно, найдутся люди, которые будут заинтересованы в том, чтобы узнать о них и о том, как вы их нашли. Если вы пришлете нам ссылку, мы даже можем включить ее в список ссылок.

## Ссылки

Главная страница проекта: <https://github.com/digininja/DVWA>

_Создано командой DVWA_
