Анализ защищенности распределенных информационных систем. DVWA
Для студентов технических специальностей
Иван Андреевич Трещев
Наталья Андреевна Гулина

Я – хакер, войдите в мой мир…

Манифест хакера

© Иван Андреевич Трещев, 2023

© Наталья Андреевна Гулина, 2023

ISBN 978-5-0062-0948-0

Создано в интеллектуальной издательской системе Ridero

Введение

Научить «взламывать» информационные системы невозможно. Это другой – альтернативный образ мысли. Данная книга не является пособием по практике тестирования на проникновение, а скорее содержит в себе описание наиболее распространенных уязвимостей на примере популярного образа  DVWA

DVWA содержит 14 уязвимостей (названия представлены из веб-приложения):

– Brute Force;

– Command Injection;

– CSRF;

– File Inclusion;

– File Upload;

– Insecure CAPTCHA;

– SQL Injection;

– SQL Injection (Blind);

– Weak Session IDs;

– XSS (DOM);

– XSS (Reflected);

– XSS (Stored);

– CSP Bypass;

– JavaScript.

Необходимо выполнить задание на трех различных уровнях сложности.

DVWA будет развёрнут на собственном виртуальном сервере с использованием механизмов контейнеризации (Docker). Порт 8001/TCP сервера отображается на порт 80/TCP контейнера. Доступ к серверу производится с использованием доменного имени kalkt.com. Таким образом, доступ к DVWA можно получить по ссылке http://kalkt.com:8001.

Для выполнения заданий будет использоваться виртуальная машина с установленной операционной системой Kali Linux версии 2021.1 и виртуальная сеть между DVWA и kali.

Авторы выражают огромную благодарность студентам группы 6ИБ-1 ФГБОУ ВО КнАГУ за неоценимую помощь в подготовке материалов книги.

1 Command Injection Low

Command Injection (внедрение команды) – уязвимость, представленная в пункте A1 OWASP Top 10 (внедрение). Она позволяет выполнять на стороне сервера произвольный код.

В DVWA на странице Command Injection представлена форма, изображённая на рисунке 1.1. В неё пользователь может написать адрес узла, который будет являться аргументом команды ping.

Рисунок 1.1 – Форма с полем ввода адреса

При вводе корректного адреса выводится результат работы утилиты ping.

В ОС Linux в оболочке bash допускается исполнять несколько команд в одной строке, используя; (точку с запятой) как разделитель команд.

На рисунке 1.2 изображено подтверждение наличия уязвимости. На стороне сервера будет выполнена команда «ping localhost; echo Hello».

Рисунок 1.2 – Подтверждение наличия уязвимости

Для уменьшения времени получения вывода можно не писать аргумент команде ping, то есть, вводить первым символом точку с запятой.

По заданию необходимо получить имя текущего пользователя и hostname контейнера (docker-контейнера). Команды, выводящие указанные данные, изображены на рисунке 1.3. На стороне сервера при этом выполнится команда «ping; id -u -n; hostname».

Рисунок 1.3 – Имя пользователя и hostname

2 Command Injection Medium

В DVWA на странице Command Injection представлена форма, изображённая на рисунке 2.1. В неё пользователь может написать адрес узла, который будет являться аргументом команды ping.

Рисунок 2.1 – Форма с полем ввода адреса

При вводе корректного адреса выводится результат работы утилиты ping.

При попытке использования точку с запятой как разделитель команд, выясняется, что пользовательский ввод фильтруется. Также невозможно использовать оператор &&.

Однако при вводе команды после оператора & обнаруживается уязвимость.

На рисунке 2.2 изображено подтверждение наличия уязвимости. На стороне сервера будет выполнена команда «ping localhost; echo Hello».

Рисунок 2.2 – Подтверждение наличия уязвимости

Для уменьшения времени получения вывода можно не писать аргумент команде ping, то есть, вводить первым символом &.

По заданию необходимо получить имя текущего пользователя и hostname контейнера (docker-контейнера). Команды, выводящие указанные данные, изображены на рисунке 2.3. На стороне сервера при этом выполнится команда «ping &id -u -n&hostname».

Рисунок 2.3 – Имя пользователя и hostname

3 Command Injection Hard

Command Injection (внедрение команды) – уязвимость, представленная в пункте A1 OWASP Top 10 (внедрение). Она позволяет выполнять на стороне сервера произвольный код.

В DVWA на странице Command Injection представлена форма, изображённая на рисунке 3.1. В неё пользователь может написать адрес узла, который будет являться аргументом команды ping.

Рисунок 3.1 – Форма с полем ввода адреса

При вводе корректного адреса выводится результат работы утилиты ping.

При попытке использования в качестве разделителей команд различные символы выясняется, что использование прямой черты (|) без пробела помогает обойти механизм фильтрации пользовательского ввода.

На рисунке 3.2 изображено подтверждение наличия уязвимости. На стороне сервера будет выполнена команда «ping localhost; echo Hello».

Рисунок 3.2 – Подтверждение наличия уязвимости

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

По заданию необходимо получить имя текущего пользователя и hostname контейнера (docker-контейнера). Команды, выводящие указанные данные, изображены на рисунках 3.3 и 3.4. На стороне сервера при этом выполнятся команды «ping |id» и «ping |hostname».

Рисунок 3.3 – Имя пользователя

Рисунок 3.4 – hostname

4 File Inclusion Low

File Inclusion – уязвимость, заключающаяся в возможности использования и выполнения файлов на стороне сервера путём формирования определённого запроса к серверу.

Задание состоит в том, что необходимо прочитать содержимое файла ../hackable/flags/fi.php.

В DVWA на странице File Inclusion представлены три файла. При открытии любого файла его название отображается в строке запроса. Это означает, что GET-параметр page определяет, какой файл необходимо открыть, что изображено на рисунке 4.1.

Рисунок 4.1 – Пример открытия файла

Для демонстрации наличия уязвимости будет предпринята попытка прочитать файл /etc/passwd. На рисунке 4.2 изображено его содержимое.

Рисунок 4.2 – Содержимое файла /etc/passwd

Для того, чтобы просмотреть содержимое файла php, а не исполнить его, можно использовать механизм фильтров php. Например, можно использовать вывод файла в base64, что продемонстрировано на рисунке 4.3.

Рисунок 4.3 – Использование фильтров php

На рисунке 4.4 изображено декодированное содержимое файла.

Рисунок 4.4 – Содержимое файла ../hackable/flags/fi.php

5 File Inclusion Medium

File Inclusion – уязвимость, заключающаяся в возможности использования и выполнения файлов на стороне сервера путём формирования определённого запроса к серверу.

Задание состоит в том, что необходимо прочитать содержимое файла ../hackable/flags/fi.php.

В DVWA на странице File Inclusion представлены три файла. При открытии любого файла его название отображается в строке запроса. Это означает, что GET-параметр page определяет, какой файл необходимо открыть, что изображено на рисунке 5.1.

Рисунок 5.1 – Пример открытия файла

Опытным путём установлено, что последовательность символов».. /” фильтруется. Предположительно, заменяется на пустую строку, так как при параметре page равном “../../../file3.php» открывается файл file3.php, изображённый на рисунке 5.1.

Существует метод обхода подобной фильтрации. В нём используется тот факт, что операция замены последовательности символов во входных данных выполняется только один раз. Это позволяет использовать конструкции вида «….//». Эта последовательность будет преобразована в».. /».

Для демонстрации наличия уязвимости будет предпринята попытка прочитать файл /etc/passwd с помощью параметра page равному «…//…//…//…//…//etc/passwd». На рисунке 5.2 изображено его содержимое.

Рисунок 5.2 – Содержимое файла /etc/passwd

Для того, чтобы просмотреть содержимое файла php, а не исполнить его, можно использовать механизм фильтров php. Например, можно использовать вывод файла в base64, что продемонстрировано на рисунке 5.3.

Рисунок 5.3 – Использование фильтров php

На рисунке 5.4 изображено декодированное содержимое файла.

Рисунок 5.4 – Содержимое файла ../hackable/flags/fi.php

6 File Inclusion High

File Inclusion – уязвимость, заключающаяся в возможности использования и выполнения файлов на стороне сервера путём формирования определённого запроса к серверу.

Задание состоит в том, что необходимо прочитать содержимое файла ../hackable/flags/fi.php.

В DVWA на странице File Inclusion представлены три файла. При открытии любого файла его название отображается в строке запроса. Это означает, что GET-параметр page определяет, какой файл необходимо открыть, что изображено на рисунке 6.1.

Рисунок 6.1 – Пример открытия файла

Опытным путём выяснено, что механизм фильтрации пропускает только запросы с файлом, начинающимся с «file». Для обхода такого типа фильтрации используется URI-схема file.

Для демонстрации наличия уязвимости будет предпринята попытка прочитать файл /etc/passwd. На рисунке 6.2 изображено его содержимое.

Рисунок 6.2 – Содержимое файла /etc/passwd

Сервер не позволяет обращаться через File URI-scheme, используя относительные пути. Но можно предположить, что корневая директория веб-приложения – /var/www/html/, так как популярные веб-серверы (Apache, Nginx) по умолчанию используют её. На рисунке 6.3 изображён вывод файла hackable/flags/fi.php. На данном уровне сложности скрытую строку посмотреть не представляется возможным, так как использование File URI-scheme не позволяет использовать фильтры языка программирования PHP внутри пути.

Рисунок 6.3 – Файл hackable/flags/fi.php

7 SQL Injection Low

SQL Injection (внедрение кода SQL) – атака, связанная с внедрением в SQL-запрос сервера к СУБД произвольного кода.

В DVWA на странице SQL Injection представлена форма ввода id пользователя, изображённая на рисунке 7.1.

Рисунок 7.1 – Форма ввода

Для эксплуатации уязвимости будет использована утилита sqlmap.

На рисунке 7.2 представлена команда, запускающая сканирование: «sqlmap -u "http://kalkt.com:8001/vulnerabilities/sqli/?id=123&Submit=Submit" – cookie=’security=low; PHPSESSID=mp4p8kk8or3m2s7spc22ng0m73»».

Рисунок 7.2 – Запуск сканирования

В ходе сканирования было выяснено, что используется СУБД MySQL, уязвимый параметр – id. Результаты сканирования изображены на рисунке 7.3.

Рисунок 7.3 – Результаты сканирования

Далее необходимо получить список баз данных, для этого к команде добавляется ключ —dbs: «sqlmap -u "http://kalkt.com:8001/vulnerabilities/sqli/?id=123&Submit=Submit" – cookie=’security=low; PHPSESSID=mp4p8kk8or3m2s7spc22ng0m73» —dbs». Результаты изображены на рисунке 7.4.

Рисунок 7.4 – Список баз данных

Теперь можно получить список таблиц в базе dvwa. Для этого через ключ -D нужно указать БД, затем указать ключ —tables, чтобы получить названия таблиц: «sqlmap -u "http://kalkt.com:8001/vulnerabilities/sqli/?id=123&Submit=Submit" – cookie=’security=low; PHPSESSID=mp4p8kk8or3m2s7spc22ng0m73» -D dvwa —tables». Результаты изображены на рисунке 7.5.

Рисунок 7.5 – Таблицы в базе dvwa

Теперь можно получить записи таблицы users. Для этого ключ —tables меняется на -T users, добавляется ключ —dump: «sqlmap -u "http://kalkt.com:8001/vulnerabilities/sqli/?id=123&Submit=Submit" – cookie=’security=low; PHPSESSID=mp4p8kk8or3m2s7spc22ng0m73» -D dvwa -T users —dump». Результаты изображены на рисунке 7.6.

Рисунок 7.6 – Содержимое таблицы users

Также на скриншоте видно, что sqlmap в процессе работы нашёл пароли в открытом виде, использовав перебор по встроенному словарю.

8 SQL Injection Medium

SQL Injection (внедрение кода SQL) – атака, связанная с внедрением в SQL-запрос сервера к СУБД произвольного кода.

В DVWA на странице SQL Injection представлена форма ввода id пользователя, изображённая на рисунке 8.1.

Рисунок 8.1 – Форма ввода

Для эксплуатации уязвимости будет использована утилита sqlmap. В качестве аргумента будет передаваться файл, содержащий POST-запрос в текстовом виде. Содержимое файла представлено на рисунке 8.2.

Рисунок 8.2 – Содержимое файла header. txt

На рисунке 8.3 представлена команда, запускающая сканирование: «sqlmap -r header. txt».

Рисунок 8.3 – Запуск сканирования

В ходе сканирования было выяснено, что используется СУБД MySQL, уязвимый параметр – id. Результаты сканирования изображены на рисунке 8.4.

Рисунок 8.4 – Результаты сканирования

Далее необходимо получить список баз данных, для этого к команде добавляется ключ —dbs: «sqlmap -r header. txt – dbs». Результаты изображены на рисунке 8.5.

Рисунок 8.5 – Список баз данных

Теперь можно получить список таблиц в базе dvwa. Для этого через ключ -D нужно указать БД, затем указать ключ —tables, чтобы получить названия таблиц: «sqlmap -r header. txt -D dvwa – tables». Результаты изображены на рисунке 8.6.

Рисунок 8.6 – Таблицы в базе dvwa

Теперь можно получить записи таблицы users. Для этого ключ —tables меняется на -T users, добавляется ключ —dump: «sqlmap -r header. txt -D dvwa -T users – dump». Результаты изображены на рисунке 8.7.

Рисунок 8.7 – Содержимое таблицы users

Также на скриншоте видно, что sqlmap в процессе работы нашёл пароли в открытом виде, использовав перебор по встроенному словарю.

9 SQL Injection High

SQL Injection (внедрение кода SQL) – атака, связанная с внедрением в SQL-запрос сервера к СУБД произвольного кода.

В DVWA на странице SQL Injection представлена ссылка на форму ввода id пользователя, изображённую на рисунке 9.1.

Рисунок 9.1 – Форма ввода

Для эксплуатации уязвимости будет использована утилита sqlmap.

Отличительная особенность уровня – ввод данных и вывод данных осуществляются на разных страницах. Для решения этой проблемы будет использоваться аргумент —second-url.

На рисунке 9.2 представлена команда, запускающая сканирование: «sqlmap -u "http://kalkt.com:8001/vulnerabilities/sqli/session-input.php" – second-url "http://kalkt.com:8001/vulnerabilities/sqli/" – data „id=1&Submit=Submit“ – cookie „PHPSESSID=l6145c6k5p19go7ga5g16mh7k0; security=high“».

Рисунок 9.2 – Запуск сканирования

В ходе сканирования было выяснено, что используется СУБД MySQL, уязвимый параметр – id. Результаты сканирования изображены на рисунке 9.3.

Рисунок 9.3 – Результаты сканирования

Далее необходимо получить список баз данных, для этого к команде добавляется ключ —dbs: «sqlmap -u "http://kalkt.com:8001/vulnerabilities/sqli/session-input.php" – second-url "http://kalkt.com:8001/vulnerabilities/sqli/" – data „id=1&Submit=Submit“ – cookie „PHPSESSID=l6145c6k5p19go7ga5g16mh7k0; security=high“ – dbs». Результаты изображены на рисунке 9.4.

Рисунок 9.4 – Список баз данных

Теперь можно получить список таблиц в базе dvwa. Для этого через ключ -D нужно указать БД, затем указать ключ —tables, чтобы получить названия таблиц: «sqlmap -u "http://kalkt.com:8001/vulnerabilities/sqli/session-input.php" – second-url "http://kalkt.com:8001/vulnerabilities/sqli/" – data „id=1&Submit=Submit“ – cookie „PHPSESSID=l6145c6k5p19go7ga5g16mh7k0; security=high“ -D dvwa – tables». Результаты изображены на рисунке 9.5.

Рисунок 9.5 – Таблицы в базе dvwa

Теперь можно получить записи таблицы users. Для этого ключ —tables меняется на -T users, добавляется ключ —dump: «sqlmap -u "http://kalkt.com:8001/vulnerabilities/sqli/session-input.php" – second-url "http://kalkt.com:8001/vulnerabilities/sqli/" – data „id=1&Submit=Submit“ – cookie „PHPSESSID=l6145c6k5p19go7ga5g16mh7k0; security=high“ -D -T users – dump». Результаты изображены на рисунке 9.6.

Рисунок 9.6 – Содержимое таблицы users

Также на скриншоте видно, что sqlmap в процессе работы нашёл пароли в открытом виде, использовав перебор по встроенному словарю.

10 SQL Injection (Blind) Low

SQL Injection (внедрение кода SQL) – атака, связанная с внедрением в SQL-запрос сервера к СУБД произвольного кода. Blind (слепая) инъекция не выводит пользователю никакой информации. Для получения информации злоумышленник использует предположения о длительности выполнения различных операций.

В DVWA на странице SQL Injection (Blind) представлена форма ввода id пользователя, изображённая на рисунке 10.1.

Рисунок 10.1 – Форма ввода

Для эксплуатации уязвимости будет использована утилита sqlmap.

На рисунке 10.2 представлена команда, запускающая сканирование: «sqlmap -u "http://kalkt.com:8001/vulnerabilities/sqli_blind/?id=1&Submit=Submit" – cookie=«PHPSESSID=mp4p8kk8or3m2s7spc22ng0m73; security=low’».

Рисунок 10.2 – Запуск сканирования

В ходе сканирования было выяснено, что используется СУБД MySQL, уязвимый параметр – id. Результаты сканирования изображены на рисунке 10.3.

Рисунок 10.3 – Результаты сканирования

Далее необходимо получить список баз данных, для этого к команде добавляется ключ —dbs: «sqlmap -u "http://kalkt.com:8001/vulnerabilities/sqli_blind/?id=1&Submit=Submit" – cookie=«PHPSESSID=mp4p8kk8or3m2s7spc22ng0m73; security=low’ – dbs». Результаты изображены на рисунке 10.4.

Рисунок 10.4 – Список баз данных

Теперь можно получить список таблиц в базе dvwa. Для этого через ключ -D нужно указать БД, затем указать ключ —tables, чтобы получить названия таблиц: «sqlmap -u "http://kalkt.com:8001/vulnerabilities/sqli_blind/?id=1&Submit=Submit" – cookie=«PHPSESSID=mp4p8kk8or3m2s7spc22ng0m73; security=low’ -D dvwa – tables». Результаты изображены на рисунке 10.5.

Рисунок 10.5 – Таблицы в базе dvwa

Теперь можно получить записи таблицы guestbook. Для этого ключ —tables меняется на -T guestbook, добавляется ключ —dump: «sqlmap -u "http://kalkt.com:8001/vulnerabilities/sqli_blind/?id=1&Submit=Submit" – cookie=«PHPSESSID=mp4p8kk8or3m2s7spc22ng0m73; security=low’ -D dvwa -T guestbook – dump». Результаты изображены на рисунке 10.6.

Конец ознакомительного фрагмента.

Текст предоставлен ООО «Литрес».

Прочитайте эту книгу целиком, купив полную легальную версию на Литрес.

Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.