# DAMN VULNERABLE WEB APPLICATION

DVWA (англ. _Damn Vulnerable Web Application_ &mdash; бісів вразливий вебзастосунок) &mdash; це
вебзастосунок на базі PHP/MariaDB, який є надзвичайно вразливим. Його основна мета &mdash; допомогти
фахівцям із безпеки перевірити свої навички та інструменти в легальному середовищі, допомогти
веброзробникам краще зрозуміти процеси захисту вебзастосунків, а також допомогти студентам і
викладачам вивчати веббезпеку у контрольованому навчальному середовищі.

Мета DVWA &mdash; дати змогу **відчути на практиці деякі з найпоширеніших вебвразливостей** на
**різних рівнях складності** за допомогою простого та зрозумілого інтерфейсу. Будь ласка, зверніть
увагу, що в цьому програмному забезпеченні є **як задокументовані, так і незадокументовані
вразливості**. Це зроблено навмисно. Ми заохочуємо вас спробувати виявити якомога більше проблем.

---

## УВАГА!

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) &mdash; це вільне програмне забезпечення: ви можете
розповсюджувати та/або змінювати його відповідно до умов GNU General Public License, опублікованої
Free Software Foundation, версії 3 або (на ваш розсуд) будь-якої пізнішої версії.

Damn Vulnerable Web Application (DVWA) розповсюджується з надією, що воно буде корисним,
але БЕЗ ЖОДНИХ ГАРАНТІЙ; навіть без неявної гарантії ТОВАРНОГО СТАНУ чи ПРИДАТНОСТІ ДЛЯ ПЕВНОЇ МЕТИ.
Докладнішу інформацію дивіться в GNU General Public License.

Ви мали отримати копію GNU General Public License разом із 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)

Якщо ви бажаєте долучитися до перекладу, будь ласка, надішліть PR. Проте зауважте, що це не означає
просто пропустити текст через Google Translate і надіслати результат &mdash; такі PR будуть
відхилені. Надішліть свою версію перекладу, додавши новий файл `README.xx.md`, де `xx` &mdash; це
дволітерний код вибраної вами мови (згідно
з [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. **Запустіть скрипт із правами суперкористувача:**

   ```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 &mdash; це завантажити та
встановити [XAMPP](https://www.apachefriends.org/), якщо у вас ще не налаштовано вебсервер.

XAMPP &mdash; це дуже простий у встановленні дистрибутив 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
Container Registry.

Для отримання додаткової інформації про те, що ви одержуєте, ви можете
переглянути [готові 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
    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.

2. Клонуйте або завантажте цей репозиторій та розпакуйте його (
   див. [«Завантаження»](#завантаження)).
3. Відкрийте термінал на свій вибір і змініть робочу директорію на цю директорію (`DVWA`).
4. Виконайте команду `docker compose up -d`.

Тепер DVWA доступний за адресою `http://localhost:4280`.

**Зверніть увагу, що для запуску DVWA в контейнерах вебсервер прослуховує порт 4280 замість звичного
80-го порту.**
Для отримання додаткової інформації щодо цього рішення див.
розділ [«Я хочу запустити DVWA на іншому порту»](#я-хочу-запустити-dvwa-на-іншому-порту).

#### Локальна збірка

Якщо ви внесли локальні зміни та хочете зібрати проєкт локально, перейдіть до `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, у вас має бути активований модуль Apache
`mod_rewrite`. Щоб зробити це в Linux, виконайте:

```
a2enmod rewrite
```

А відтак перезапустіть Apache командою:

```
apachectl restart
```

### Файли сторонніх розробників (Vendor Files)

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

Спочатку переконайтеся, що у вас встановлено Composer. Трапляються проблеми зі зворотною
сумісністю, тому я завжди завантажую останню версію звідси:

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

Дотримуйтесь інструкцій на сайті, щоб встановити його.

Перейдіть у каталог `vulnerabilities/api` та виконайте команду:

```
composer.phar install
```

Обов'язково встановіть Composer глобально.

## Конфігурація

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

DVWA постачається з макетом файлу конфігурації, який треба скопіювати на потрібне місце, а
відтак внести відповідні зміни. На Linux це можна зробити так (припускаємо, що ви перебуваєте в
каталозі DVWA):

```sh
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).

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

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

### Налаштування бази даних

Щоб налаштувати базу даних, просто натисніть кнопку `Setup 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/` &mdash; має бути доступним для запису вебслужбою (для завантаження файлів).

### Конфігурація 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

Це потрібно лише для лабораторії «Insecure CAPTCHA». Якщо ви не працюєте з нею, можете проігнорувати
цей розділ.

Згенеруйте пару API-ключів на сторінці <https://www.google.com/recaptcha/admin/create>.

Потім вставте їх у відповідні розділи файлу `./config/config.inc.php`:

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

### Типові облікові дані

**Типовий логін = `admin`**

**Типовий пароль = `password`**

_...його легко можна зламати перебором (brute force) ;)_

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 для інших завдань.
- Деякі користувачі можуть використовувати рушії контейнеризації без прав суперкористувача (як-от
  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-адресу в локальній мережі).
У такому разі він буде прослуховувати з'єднання на всіх доступних мережевих інтерфейсах. Утім з
міркувань безпеки стандартом є обмеження доступу лише локальним інтерфейсом (loopback).
Зрештою, це «бісів вразливий вебзастосунок» (damn vulnerable web application), що працює на вашій
машині.

#### 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 (місце, де він починає пошук вебконтенту) &mdash; це
`/var/www/html`. Якщо ви розташуєте файл `hello.txt` у цьому каталозі, то для доступу до нього
потрібно перейти за адресою `http://localhost/hello.txt`.

Якщо ви створили директорію і поклали файл туди &mdash; `/var/www/html/mydir/hello.txt` &mdash; тоді
треба перейти за адресою `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`.

Інша поширена помилка &mdash; перехід за адресою `http://localhost/dvwa`, що видасть `404`, оскільки
з погляду відповідності каталогів у Linux `dvwa` &mdash; це не те саме, що `DVWA`.

Тож якщо після налаштування ви намагаєтеся відвідати сайт і отримуєте `404`, подумайте, куди саме ви
встановили файли, де вони розташовані відносно кореневого каталогу і в якому регістрі написана назва
директорії, яку ви використали.

### Я перейшов на сайт і побачив порожній екран

[Відеодопомога](https://youtu.be/C-kig5qrPSA?si=wTS3Aj8fycW3Idfr&t=243)

Зазвичай це одна проблема конфігурації, що приховує іншу. Типово PHP не відображає
помилки, тому якщо ви забули ввімкнути відображення помилок під час процесу налаштування, будь-які
інші проблеми, як-от помилка під'єднання до бази даних, зупинять завантаження застосунку, але
повідомлення про те, що саме пішло не так, буде приховано.

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

### «Access denied» (Доступ заборонено) під час запуску налаштування

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

```mariadb
Database Error #1045: Access denied for user 'notdvwa'@'localhost' (using password: YES).
```

Помилка повідомляє, що ви використовуєте ім'я користувача `notdvwa`.

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

```mariadb
SQL: Access denied for user 'dvwa'@'localhost' to database 'notdvwa'
```

Тут сказано, що ви використовуєте користувача `dvwa` і намагаєтеся під'єднатися до бази даних
`notdvwa`.

Перше, що потрібно зробити, &mdash; це ще раз перевірити, чи те, що ви вказали в конфігураційному
файлі, відповідає дійсності.

Якщо все збігається з вашими очікуваннями, наступним кроком буде перевірка можливості входу під цим
користувачем через командний рядок. Припустімо, у вас є користувач бази даних `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 and others.

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

MariaDB [dvwa]>
```

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

Якщо ви бачите таке, то ім'я користувача або пароль, які ви використовуєте, неправильні.
Повторіть кроки з розділу [Налаштування бази даних](#налаштування-бази-даних) і переконайтеся, що ви
використовуєте однакові ім'я користувача та пароль протягом усього процесу.

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

Якщо ви отримуєте таке, то облікові дані користувача правильні, але користувач не має доступу до
бази даних. Знову ж таки, повторіть кроки налаштування та перевірте назву бази даних, яку ви
використовуєте.

```mariadb
ERROR 1044 (42000): Access denied for user 'dvwa'@'localhost' to database 'dvwa'
```

Остання помилка, яку ви можете отримати, це:

```mariadb
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```

Це не проблема автентифікації, а повідомлення про те, що сервер бази даних не запущений. Запустіть
його за допомогою такої команди:

```sh
sudo service mysql start
```

### Помилка з'єднання (Connection Refused)

[Відеоінструкція](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.
```

У вас є два варіанти. Найпростіший &mdash; видалити 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`
2. Під рядком `[mysqld]` додайте таке:
   `default-authentication-plugin=mysql_native_password`
3. Перезапустіть базу даних: `sudo service mysql restart`
4. Перевірте метод автентифікації для вашого користувача бази даних:

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

5. Швидше за все, ви побачите `caching_sha2_password`. Якщо так, виконайте таку команду:

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

6. Після повторної перевірки ви маєте побачити `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 row in set (0.00 sec)
    ```

Після цього процес налаштування має запрацювати у звичному режимі.

Для додаткової інформації див.: <https://www.php.net/manual/en/mysqli.requirements.php>.

### Помилка бази даних №2002: No such file or directory

Сервер бази даних не запущено. У дистрибутивах на базі Debian це можна зробити за допомогою команди:

```sh
sudo service mysql start
```

### Помилки «MySQL server has gone away» та «Packets out of order»

Ці помилки можуть виникати з кількох причин, але найімовірніша полягає в тім, що версія сервера
бази даних несумісна з версією PHP.

Найчастіше це трапляється під час використання останньої версії MySQL, оскільки вона погано взаємодіє з PHP.
Найкраща порада &mdash; відмовтеся від 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>

Перш ніж створювати тікет, переконайтеся, що ви використовуєте останню версію коду з репозиторію. Це
не останній реліз, а найсвіжіший код із гілки `master`.

Під час створенні тікета зазначте щонайменше таку інформацію:

- Операційна система
- Останні 5 рядків із логу помилок вебсервера безпосередньо після виникнення помилки, про яку ви
  повідомляєте
- Якщо проблема пов'язана з автентифікацією бази даних, виконайте описані вище кроки та зробіть
  знімок екрана кожного з них. Надішліть їх разом зі знімком екрана розділу конфігураційного файлу,
  де вказано ім'я користувача та пароль бази даних.
- Повний опис того, що саме йде негаразд, чого ви очікуєте, і що ви вже намагалися зробити, щоб це
  виправити. Фрази «вхід не працює» недостатньо, щоб ми могли зрозуміти вашу проблему та допомогти
  її розв'язати.

---

## Навчальні посібники

Я збираюся підготувати кілька навчальних відео, які розкривають деякі вразливості та показують, як
їх виявити, а відтак &mdash; як ними скористатися. Ось ті, що я вже зробив:

[Пошук та експлуатація відбитого XSS](https://youtu.be/V4MATqtdxss)

---

## SQLite3 SQL-ін'єкція

_Підтримка цієї функції обмежена. Перш ніж повідомляти про проблеми, будь ласка, переконайтеся, що
ви готові до самостійного налагодження; не варто просто стверджувати, що «це не працює»._

Типово SQLi та Blind SQLi виконуються на сервері MariaDB/MySQL, який використовується
сайтом, але можна перемкнути налаштування, щоб тестувати SQL-ін'єкції на базі 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:

Якщо у вас є ідея, якесь покращення або ви просто хочете співпрацювати, ми запрошуємо вас долучатися
та брати участь у проєкті &mdash; сміливо надсилайте свої 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>

---

## Повідомлення про вразливості

Простіше кажучи, будь ласка, не робіть цього!

Приблизно раз на рік хтось надсилає звіт про вразливість, яку вони знайшли в додатку. Деякі з них
добре написані, іноді навіть краще, ніж ті, що я бачив у платних звітах з тестування на проникнення,
а деякі &mdash; це просто «у вас відсутні заголовки, заплатіть мені».

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

У застосунку є вразливості, і це зроблено навмисно. Більшість із них &mdash; це добре
задокументовані приклади, які ви опрацьовуєте як уроки, інші &mdash; «приховані», які ви маєте
знайти самостійно. Якщо ви справді хочете похизуватися своїми навичками пошуку прихованих секретів,
напишіть допис у блозі або створіть відео, оскільки напевно знайдуться люди, яким буде цікаво
дізнатися про них і про те, як ви їх знайшли. Якщо ви надішлете нам посилання, ми навіть можемо
додати його до списку джерел.

## Посилання

Домашня сторінка проєкту: <https://github.com/digininja/DVWA>

_Створено командою DVWA_
