Ключом стать грамотным ибэшником является знание тех технологий, которые вы пытаетесь использовать.
SQL-инъекция – один из наиболее распространенных методов атаки, используемых сегодня, а также один из самых простых для изучения.
Чтобы понять, как эта атака работает, вам нужно твердо понять … вы догадались … SQL.
Эта серия начнется с оснований SQL и SQL-инъекций, перехода к идентификации базы данных и более продвинутых методов и, наконец, закрытия с помощью методов, используемых для предотвращения и смягчения этих типов атак.
Что такое SQL-инъекция?
SQL, который представляет собой язык структурированных запросов, является стандартным языком, используемым для извлечения и обработки данных в системе управления реляционными базами данных (RDBMS).
Доступ к данным осуществляется с помощью запросов, которые позволяют создавать, читать, обновлять и удалять информацию (поэтому по этой причине вы часто увидите веб-приложения, называемые приложениями CRUD).
Базы данных могут использоваться в различных ситуациях, но одной из наиболее распространенных конфигураций является база данных, которая служит в качестве бэкэнд для веб-приложения.
Когда выполняются определенные действия, такие как вход в систему или поиск, запросы отправляются из веб-приложения в базу данных.
Инъекция допускается, когда поля ввода не подвергаются надлежащей дезинфекции или экранированию.
Злоумышленник может вводить вредоносные команды SQL, чтобы получить доступ к данным, которые в противном случае были бы вне поля зрения. SQL-инъекция, как правило, считается сильным воздействием, поскольку она позволяет злоумышленникам получать конфиденциальную информацию, подделывать данные, уничтожать данные или даже эскалировать привилегии и выдавать команды ОС на сервере.
Как правило, любой вход на веб-странице потенциально уязвим для SQL-инъекции, потому что именно там он взаимодействует с базой данных.
Формы аутентификации, в которых пользователь входит в систему с именем пользователя и паролем, являются наиболее распространенными типами данных, которые используются, но формы поиска, формы контактов и загрузки файлов – все это потенциальные цели для инъекций.
В первой части этой серии мы рассмотрим основы SQL, чтобы лучше понять типы выполняемых атак.
Анатомия базы данных
Данные, содержащиеся в реляционной базе данных, хранятся в объектах, называемых таблицами.
Эти таблицы представляют собой виртуальное представление отношений между различными элементами, состоящими из строк и столбцов.
Строки, называемые записями, содержат данные для каждой отдельной записи в базе данных.
Поля, которые являются столбцами таблицы, представляют собой конкретную информацию для каждой записи.
Это лучше иллюстрируется в следующей таблице «Users»:
Эта таблица содержит три записи и четыре поля; каждому пользователю в базе данных присваивается идентификатор, имя, имя пользователя и пароль.
В действительности таблицы намного больше, чем это, и могут содержать миллионы записей, а сама база данных может содержать столько же таблиц.
Вы можете увидеть, насколько ценная инъекция SQL может быть полезна для злоумышленника с таким большим количеством данных, которое созрело для выбора.
Типы данных и операторы
Чтобы понять данные, с которыми мы работаем, нам нужно знать различные типы данных, используемых в SQL.
Хотя точные типы данных различаются между различными системами баз данных, в большинстве случаев они достаточно схожи, чтобы сказать, что они собой представляют; Обычно они классифицируются по тексту, числу и дате.
Операторы позволяют нам манипулировать и взаимодействовать с данными в SQL.
Существует пять основных категорий операторов: арифметические, поразрядные, сравнительные, составные и логические.
Большинство из них аналогичны другим языкам программирования, но существует несколько отличий.
Операторы и синтаксис
Операторы SQL – это код, который передается в базу данных для извлечения или изменения данных. Давайте рассмотрим следующий запрос и сломаем его:
SELECT * FROM Users WHERE Name=’John Smith’;
Первая часть этого оператора (SELECT * FROM Users) выбирает все поля из таблицы Users.
Предложение WHERE указывает, что мы хотим видеть только информацию из записи, где «John Smith» находится в поле «Name».
SQL использует одинарные кавычки для строк, хотя большинство систем баз данных разрешают двойные кавычки, а точка с запятой отмечает конец оператора.
Следует отметить, что ключевые слова, такие как SELECT и WHERE, нечувствительны к регистру.
Комментарии в SQL могут быть записаны как однострочные или многострочные:
–this is a single line comment SELECT * FROM Users; /*this is a multi-line comment*/
SQL-инъекция использует способ обработки комментариев путем ненужного выделения определенных частей запроса.
Следующая инъекция обходит необходимость ввода пароля:
SELECT * FROM Users WHERE Username=” or 1=1– AND Password=”;
Это вернет все записи из базы данных, так как пустая строка или 1 = 1 всегда оценивается как истина, а двойные тире (-) закомментируют поле password.
Существуют также ключевые слова, которые существуют для упрощения организации данных, таких как MIN и MAX, BETWEEN, и ORDER BY.
Давайте посмотрим на следующую таблицу под названием LoginSessions:
Предположим, мы хотели узнать, кто был зарегистрирован последним, и тогда – запрос ниже вернет идентификатор, имя пользователя и самый короткий и самый длинный сеанс между двумя датами:
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 объединяет строки BY ID и ORDER BY MAX (SessionLength). DESC показывает нам пользователя с самым длинным сеансом (нисходящий, а не восходящий).
Другие полезные операторы включают INSERT INTO, который вставляет новые записи в таблицу UPDATE, которая обновляет существующие записи в таблице и DELETE, которая используется для удаления записей в таблице.
Эти типы запросов могут быть полезны для SQL-инъекций, когда вы хотите сделать больше, чем просто извлекать информацию из базы данных.
Злоумышленник может вставить новую запись, указывающую, что они купили что-то из интернет-магазина, например, и утверждают, что они никогда не получали продукт и не получали его за это.
Если они действительно хотели нанести максимальный урон, можно использовать оператор DROP.
DROP TABLE удалит существующую таблицу в базе данных, а DROP DATABASE удалит всю базу данных.