20 апреля, 2024

Базы данных и основы SQL, которые должен знать каждый хакер

Содержание:

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

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

Что такое SQL-инъекция

SQL означает Structured Query Language (язык структурированных запросов), является стандартным языком, который используется для извлечения и обработки данных в системах управления реляционными базами данных (RDBMS). Доступ к данным осуществляется с помощью запросов, которые позволяют создавать (Create), читать (Read), обновлять (Update) и удалять (Delete) информацию (по этой причине вы будете часто встречать веб-приложения, называемые CRUD-приложениями).

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

Инъекцию возможно использовать, когда поля ввода HTML-форм никак не экранируют (escape) или не фильтруют (sanitized) входные данные. В результате чего злоумышленник может вводить вредоносные SQL-команды для получения доступа к данным, которые в нормальных условиях должны быть спрятаны от пользователя. SQL-инъекции, как правило, считаются достаточно сильным и эффективным средством воздействия, поскольку они позволяют хакерам получать конфиденциальную информацию, подделывать данные, уничтожать данные или даже получать права администратора и использовать команды ОС на самом сервере.

Любые поля для ввода данных на какой-нибудь веб-странице потенциально уязвимы для SQL-инъекций, потому что именно там происходит взаимодействие с базой данных. Формы авторизации, где пользователь, введя логин и пароль, входит в систему — это наиболее распространенные поля для ввода данных, которые эксплуатируются в первую очередь. Но кроме них также существуют HTML-формы для поиска, формы контактов и для загрузки файлов. И все это потенциальные цели для выполнения SQL-инъекций.

Читать также:  В Чехии арестован россиянин по подозрению в кибератаках в США

В первой части этой серии мы рассмотрим основы SQL, чтобы лучше понять типы выполняемых атак.

Анатомия базы данных

Данные, содержащиеся в реляционных базах данных, хранятся в объектах, которые называются таблицами. Эти таблицы представляют собой виртуальное представление отношений между различными элементами и состоят из строк и столбцов. Строки, называемые записями (records), содержат данные для каждой отдельной записи в базе данных. Поля, которые являются столбцами таблицы, представляют собой конкретную информацию для каждой записи. Это хорошо проиллюстрировано в следующей таблице «Пользователи»:

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

Типы данных и операторы

Чтобы понимать, как хранятся данные, с которыми мы работаем, нам нужно знать,различные типы данных, используемых в SQL. Несмотря на то, что конкретные типы данных могут отличаться от одной системы баз данных к другой, в большинстве случаев они достаточно схожи, чтобы можно было сказать, что они из себя представляют. Обычно они классифицируются как текст, числа и даты.

Операторы позволяют нам манипулировать и взаимодействовать с данными в SQL. Существует пять основных категорий операторов: арифметические, поразрядные, сравнительные, составные и логические. Большинство из них аналогичны имеющимся в других языках программирования, но с нюансами.

Инструкции и синтаксис

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

SELECT * FROM Users WHERE Name='John Smith';

Первая часть этой инструкции (SELECT * FROM Users) выбирает (select) все поля из таблицы Users. Ключевое слово WHERE указывает, что мы хотим видеть только те данные из записи, где значение «John Smith» находится в поле «Name».

SQL использует одинарные кавычки для строк, хотя большинство систем баз данных разрешают двойные кавычки, а точка с запятой обозначает конец инструкции. Следует отметить, что ключевые слова, такие как SELECT и WHERE, нечувствительны к регистру.

Читать также:  Продемонстрирована полноценная атака на Smart TV

Комментарии в SQL можно писать как в одну строку, так и в несколько:

--это однострочный комментарий
 SELECT * FROM Users;

/ * это
 многострочный комментарий * /

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

SELECT * FROM Users WHERE Username='' or 1=1 --AND Password='';

Эта инструкция в качестве значения вернет все записи из базы данных, так как выражение: » or 1=1 всегда возвращает True, а двойные дефисы (—) закомментируют поле Password.

Существуют также ключевые слова, которые существуют для упрощения сортировки данных, такие как MIN и MAX, BETWEEN и ORDER BY.

Давайте посмотрим на эту таблицу под названием LoginSessions:

Предположим, мы хотим узнать, кто из пользователей был залогинен дольше всех и когда — запрос ниже вернет нам ID пользователя, имя пользователя и значения самой короткой и самой длинной сессии в пределах между двумя датами:

SELECT ID, Username, MIN(SessionLength), MAX(SessionLength) FROM LoginSessions
 WHERE LoginDate BETWEEN '2018-01-01' AND '2018-05-01'
 GROUP BY ID
 ORDER BY MAX(SessionLength) DESC;

GROUP BY объединяет строки по ID (by ID) и ORDER BY MAX(SessionLength) и сортирует их по длине сессии. DESC определяет нисходящий порядок отображения пользователей, который покажет нам вначале пользователя с самой длинной сессией.

Другие полезные инструкции включают: INSERT INTO, которая вставляет (insert) новые записи в таблицу; UPDATE, которая обновляет существующие записи в таблице и DELETE, которая используется для удаления записей из таблицы. Эти типы запросов могут быть полезны для SQL-инъекций, когда вы хотите сделать больше, чем просто получить данные из базы данных.

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

Читать также:  8 млн профилей GitHub утекли из-за ошибки партнера

Join и Union

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

И вот еще одна таблица под названием Logins:

Следующая SQL-инструкция вернет дату, когда Боб Джонс (Bob Jones) входил в систему в последний раз:

SELECT Users.Username, Logins.Date FROM Users INNER JOIN Logins ON Users.ID = Logins.ID;

INNER JOIN или просто JOIN, как указано выше, будет возвращать все записи, которые имеют совпадающие данные в обеих таблицах. LEFT JOIN возвращает все записи из левой таблицы, а также те записи, которые соответствуют условию, но находятся в правой таблице, в то время как RIGHT JOIN возвращает все записи из правой таблицы, а также соответствующие записи из левой таблицы. FULL JOIN вернет все записи, которые совпадают и в левой и в правой таблице. Хотя для SQL-инъекций обычно не требуются объединения (JOIN), они могут оказаться очень полезными при извлечении данных из таблиц базы данных после того, как вы нашли способ попасть внутрь.

UNION используется для объединения отдельных данных, получаемых из двух или более инструкций SELECT. Все операторы SELECT должны извлекать один и тот же тип данных, должны иметь одинаковое количество столбцов и вызываться в том же порядке. UNION ALL делает то же самое, но не удаляет повторяющиеся строки в тех случаях, когда одни и те же данные существуют в обеих объединенных таблицах. Давайте рассмотрим пример, используя таблицы Users and Admins:

Следующая SQL-инструкция предоставит пароли пользователей и администраторов:

SELECT Password FROM Users
 UNION
 SELECT Password FROM Admins;

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

Хотите узнать об основах SQL-инъекций больше?

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

Добавить комментарий