Введение
Добро пожаловать в этот интерактивный практикум! Мы сосредоточимся на уязвимостях к SQL-инъекции - распространенной и серьезной угрозе для веб-приложений. Проще говоря, атаки SQL-инъекцией происходят, когда приложение получает данные, которые не были должным образом проверены или обработаны, и эти данные включаются в SQL-запрос. Эта уязвимость может позволить кибер-атакующим выполнять вредоносные SQL-команды, что может привести к несанкционированному доступу к конфиденциальным данным или к выполнению других вредоносных действий.
Цель этого практикума двойная. Во - первых, мы стремимся разъяснить основные концепции уязвимостей к SQL-инъекции, разбив их на понятные части. Во - вторых, мы предлагаем практические задания, чтобы помочь вам научиться эксплуатировать эти уязвимости, не с злонамеренными намерениями, а для лучшего понимания и предотвращения таких атак. Такой практический подход снабдит вас знаниями и навыками для защиты своих приложений от таких угроз.
Настройка лабораторной среды
В этом разделе мы поможем вам настроить лабораторную среду, в которой вы сможете практиковать атаки SQL-инъекцией.
Загрузка Docker-образа DVWA: Docker-образ DVWA доступен на Docker Hub. Вы можете загрузить его с помощью следующей команды:
docker pull vulnerables/web-dvwaЗапуск 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-инъекции, которые относятся к наиболее распространенным и опасным уязвимостям веб-приложений. Эти знания помогут вам выявлять и устранять такие уязвимости в реальных сценариях, улучшив свои навыки в области безопасности веб-приложений.