Использование SQL - уязвимостей в Nmap

Beginner

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Добро пожаловать в этот интерактивный практикум! Мы сосредоточимся на уязвимостях к SQL-инъекции - распространенной и серьезной угрозе для веб-приложений. Проще говоря, атаки SQL-инъекцией происходят, когда приложение получает данные, которые не были должным образом проверены или обработаны, и эти данные включаются в SQL-запрос. Эта уязвимость может позволить кибер-атакующим выполнять вредоносные SQL-команды, что может привести к несанкционированному доступу к конфиденциальным данным или к выполнению других вредоносных действий.

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


Skills Graph

Настройка лабораторной среды

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

  1. Загрузка Docker-образа DVWA:
    Docker-образ DVWA доступен на Docker Hub. Вы можете загрузить его с помощью следующей команды:

    docker pull vulnerables/web-dvwa
  2. Запуск Docker-контейнера DVWA:
    После загрузки образа вы можете запустить его с помощью следующей команды:

    docker run -d -p 80:80 --name dvwa vulnerables/web-dvwa

    Эта команда запустит новый контейнер и сопоставит порт 80 в контейнере с портом 80 на вашем хост-компьютере.

Шаг выше подготовит необходимую среду для практикума. После завершения настройки запустите браузер Firefox на своем рабочем столе и введите следующий URL: http://localhost.

Через некоторое время вы окажетесь на странице входа. По умолчанию используются следующие учетные данные: имя пользователя - "admin", пароль - "password".

Вы увидите страницу DVWA (Damn Vulnerable Web Application). Нажмите кнопку "Create/Reset Database", чтобы создать новую базу данных для приложения.

Важное примечание: В рамках этого практикума мы установим уровень безопасности на "низкий". Это сделает уязвимости к SQL-инъекции более очевидными. Для этого выберите "low" из выпадающего меню "Security Level", а затем нажмите кнопку "Submit".

Определение точки SQL-инъекции

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

Шаг 1: Переход на страницу SQL-инъекции

В левом меню приложения вы найдете ссылку с надписью "SQL Injection". Нажмите на эту ссылку, чтобы перейти на страницу SQL-инъекции. Здесь вы увидите форму, в которой требуется ввести идентификатор пользователя.

Шаг 2: Ввод примера идентификатора пользователя

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

Пример ввода:

1

Введите "1" в форму и нажмите кнопку "Submit". В выводе должны отобразиться детали о пользователе с идентификатором 1.

Шаг 3: Проверка исходного кода

Нажав кнопку "View Source", вы можете просмотреть исходный код страницы. Вы должны увидеть что - то вроде следующего PHP - кода:

$id = $_GET['id'];
$sql = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($conn, $sql);

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

Шаг 4: Подтверждение уязвимости к SQL - инъекции

Чтобы подтвердить наличие уязвимости к SQL - инъекции, попробуем внедрить одинарную кавычку (') после значения "1". Введите следующее в форму:

1'

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

Определение типа SQL-инъекции и типа базы данных

В этом разделе мы расскажем, как определить тип уязвимости к SQL-инъекции и тип базы данных, используемой в данном приложении.

Наша первая цель - определить количество столбцов, возвращаемых исходным SQL-запросом. Для этого мы будем использовать предложение ORDER BY.

Пример кода:

1' ORDER BY 1#
1' ORDER BY 2#
1' ORDER BY 3#

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

После этого мы можем использовать оператор UNION для извлечения дополнительных данных из базы данных.

Пример кода:

1' UNION SELECT version(), @@version_compile_os#

Эта SQL-инструкция извлечет версию базы данных и версию операционной системы, на которой она запущена.

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

Получение имени базы данных

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

Пример кода:

1' UNION SELECT database(), user()#

Вышеприведенный SQL-запрос представляет собой пример техники, называемой "SQL-инъекция". Это техника внедрения кода, которую атакующие используют для эксплойта уязвимости безопасности на уровне базы данных приложения. Этот конкретный запрос извлекает имя текущей базы данных и пользователя, выполняющего запрос.

Вот что происходит:

  • 1' UNION: Это первая часть SQL-инъекции. Часть 1' нужна для завершения запроса, который, вероятно, выполняет приложение. Ключевое слово UNION используется для объединения результатов двух или более операторов SELECT без возврата дублирующихся строк.
  • SELECT database(), user()#: Эта часть запроса представляет собой полезную нагрузку, которую вы внедряете. Функция database() извлекает имя текущей базы данных, а функция user() извлекает имя пользователя, выполняющего запрос.

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

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

Получение имен таблиц

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

Пример кода:

1' UNION SELECT table_name, table_schema FROM information_schema.tables WHERE table_schema = 'dvwa'#

Вышеприведенный SQL-запрос продолжает использовать технику SQL-инъекции. На этот раз она используется для извлечения имен таблиц в базе данных и соответствующих схем базы данных.

Вот разбор запроса:

  • 1' UNION: Как уже было объяснено ранее, эта часть нужна для завершения вероятного запроса приложения и объединения его с нашей внедренной полезной нагрузкой.
  • SELECT table_name, table_schema FROM information_schema.tables WHERE table_schema = 'dvwa': Эта часть запроса представляет собой нашу внедренную полезную нагрузку. Она извлекает имена таблиц и соответствующие схемы базы данных из системной таблицы information_schema.tables, в частности для схемы 'dvwa'.

Таблица information_schema.tables - это системная таблица, которая содержит информацию о всех таблицах в базе данных. table_schema - это имя базы данных, частью которой является таблица, а table_name - это имя таблицы.

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

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

Получение имен столбцов и данных

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

Пример кода:

1' UNION SELECT 1, group_concat(column_name) FROM information_schema.columns WHERE table_name = 'users'#

Вышеприведенный SQL-запрос использует SQL-инъекцию для извлечения имен столбцов таблицы 'users'. Он объединяет эти имена столбцов в одну строку для удобства просмотра.

Вот разбор запроса:

  • 1' UNION: Как уже было объяснено ранее, эта часть нужна для завершения вероятного запроса приложения и объединения его с нашей внедренной полезной нагрузкой.
  • SELECT 1, group_concat(column_name) FROM information_schema.columns WHERE table_name = 'users': Эта часть запроса представляет собой нашу внедренную полезную нагрузку. Она извлекает имена столбцов из таблицы 'users' и объединяет их в одну строку с помощью функции group_concat.

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

Теперь, когда у нас есть имена столбцов, мы можем извлечь конфиденциальные данные из таблицы 'users'.

Пример кода:

1' UNION SELECT user, password FROM users#

Этот SQL-запрос использует SQL-инъекцию для извлечения столбцов 'user' и 'password' из таблицы 'users'.

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

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

Резюме

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

Завершив это практическое занятие, вы получили практический опыт в понимании и эксплоите уязвимостей к SQL-инъекции, которые относятся к наиболее распространенным и опасным уязвимостям веб-приложений. Эти знания помогут вам выявлять и устранять такие уязвимости в реальных сценариях, улучшив свои навыки в области безопасности веб-приложений.