October 26, 2019

SQL injection. Metasploitable. DVWA

Дата [26.10.2019] Время 23:00

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

В прошлой статье установили metasploitable.

А сейчас познакомимся с DVWA

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

Что это за зверь такой, SQL-injection (внедрение sql кода)?
https://habr.com/ru/post/130826/

Замечание! Я не буду описывать теорию. На это есть несколько причин.
* В интернете есть большое количество статей, где все это описано и лучше, и подробнее, чем если буду объяснять я
* Мне хочется показать как и где Вы можете встретиться с этим кейсом. Показать и подтолкнть в этих направлениях.


У меня система все еще запущена, ip address - 192.168.1.100 (Как узнать ip address описано в пред. статье)

В адресной строке вашего браузера вводим http://192.168.1.100/

Попадаем на такую страницу. Кликаем DVWA
Данные для входа:

login: admin
password: password


И сразу бежим в настройки. Изменяем уровень безопасности на "low"

Теперь можно потренироваться с sql-injection
Переходим на страницу "SQL Injection"
Для эффективной работы с этим типом уязвимостей хорошо (пожалуй даже необходимо знать язык SQL запросов)

В поле User ID мы вводим значения: 1 или 2 или 3 и тд
В результате наш сервис выводит нам данные о пользователе.
Скорее всего, скрипт обработки на стороне сервера выглядит примерно так:

<?php
.... <Лишнее скрыто> ....
mysql_query("SELECT id, First, Surname FROM db where 'id' = '<наш запрос>'");
....
?>

Подставляя цифры 1, 2 или 3, у нас получается where 'id'='<наше число>'
Данный запрос отрабатывает без проблем. Мы получаем


Теперь если мы сделаем так ' or '1'='1

Опа! Приложение вдруг вывело ВСЕ данные из своей БД

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

Давайте разберемся почему так случилось?

Как мы помним, скрипт на стороне сервера выглядит примерно так:

<?php .... mysql_query("SELECT id, First, Surname FROM db where 'id' = '<наш запрос>'"); .... ?>

Мы проходим по всей базе данных, забираем значения id, First, Surname из таблицы db, которые удовлетворяют части where. Например id = 1

Но на стороне сервера отсутствует фильтрация входных данных!
И наши записи из поля ввода попали сразу в скрипт. Получилось следующее:

SELECT id, First, Surname FROM db where 'id' = '' OR '1'='1'

Получили простое логическое выражение

Ложь или Истина = Истина (всегда!)

Поэтому когда происходит запрос, из БД выбирают данные, удволетворяющие условию, которое всегда истина. А поскольку условие всегда истина - выводятся ВСЕ значения из текущей таблицы. Магия, не иначе.

Итак, основная идея - сделать инъекцию SQL кода в код запроса, тем самым изменив его так, что бы он вывел данные, к которым мы не должны были иметь доступ.

Разумеется, этот пример "детский" и, вероятно, не встретится в вашей реальной практике (хотя кто знает... На каждого из нас хватит плохого кода от разработчиков). Я рекомендую читать о этой инъекции, найти еще примеры, узнать о таких штуках как комментарии, научиться составлять сложные запросы, и, самое главное, тренироваться на этой машине. Постепенно поднимать уровень безопасности до high (Там появится фильтрование входных данных, которое нужно обходить).

Основная проблема во время соревнований - это то, что мы не знаем какой скрипт стоит на обработке наших запросов.

  • Там может быть экранирование с помощью `(гравис) или '(апостроф) или "(двойная кавычка) Тогда надо писать " or "1" = "1 или ` or `1` = `1 К сожалению, универсального способа нет
  • Могут стоять фильтры. Например не пропускает запросы, содержащие or
    Тогда стоит попробовать написание oR или Or или OR

В реальной жизни подобной проблеме могут быть подвержены и другие поля. Не только поле ввода id как в нашем приложении. Поля ввода логина, пароля, адреса доставки, email address тоже могут быть уязвимы.

Эта ошибка очень распространена и входит в топ 10 уязвимостей.
Именно ее простота и огромная отдача сделали ей такую популярность.