SQL-Инъекции
Всех приветствую! На связи админ канала Falcon Bytes!
Думаю многие из вас слышали слово SQL-Инъекция, но не все понимают, что это такое. В этой статье я попытаюсь просто объяснить о том, что это такое. Приступим!
База данных — это как огромный электронный шкаф, в котором можно хранить информацию. Она помогает организовать данные так, чтобы их было легко найти, изменить или удалить. Такие данные могут быть о людях, продуктах, заказах и многом другом. Когда вы, например, регистрируете свои данные на сайте или делаете покупку онлайн, эти сведения обычно сохраняются в базе данных для последующего доступа и обработки.
SQL-инъекция (SQLi) - это уязвимость веб-безопасности, которая позволяет злоумышленнику вмешиваться в запросы, которые приложение делает к своей базе данных. Как правило, это позволяет просматривать данные, которые он обычно не может получить. Это могут быть других пользователей, или любые другие данные, доступ к которым имеет само приложение. Во многих случаях злоумышленник может изменять или удалять эти данные, вызывая постоянные изменения в содержимом или поведении приложения. SQL-Инъекция - довольно старая уязвимость и сейчас она мало где встречается, так как большинство библиотек имеют защиту от них, однако они все еще присутствуют на старых ресурсах, или сайтах, которые написаны бездарями.
Используя SQL-Инъекцию злоумышленник может получить возможность:
И это даже не полный список возможностей. Согласитесь, это достаточно опасная уязвимость.
Примеры SQL-инъекций
Существует широкий спектр уязвимостей, атак и методов SQL-инъекций, которые возникают в различных ситуациях.
Некоторые распространенные примеры инъекций SQL включают:
- Получение скрытых данных, когда вы можете изменить SQL-запрос, чтобы вернуть дополнительные результаты.
- Подрыв логики приложения, когда можно изменить запрос, чтобы вмешаться в логику приложения.
- Атаки UNION, когда можно получить данные из разных таблиц базы данных.
- Изучение базы данных, когда можно получить информацию о версии и структуре базы данных.
- Слепая SQL-инъекция (Blind sqli), когда результаты контролируемого вами запроса не возвращаются в ответах приложения.
Извлечение скрытых данных
Рассмотрим приложение для покупок, которое отображает товары в различных категориях. Когда пользователь нажимает на категорию "Подарки", его браузер запрашивает URL-адрес:
https://falcon-bytes.github.io/?category=Gifts
Это заставляет приложение выполнить SQL-запрос для получения информации о соответствующих товарах из базы данных:
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
Этот SQL-запрос просит базу данных вернуть:
все данные (*) из таблицы продуктов где категория - "Gifts" released = 1.
Ограничение released = 1 используется для скрытия продуктов, которые не выпущены. Для невыпущенных продуктов, предположительно, released = 0.
В приложении не реализована защита от атак SQL-инъекций, поэтому злоумышленник может построить атаку типа:
https://falcon-bytes.github.io/products?category=Gifts'--.
В результате получится SQL-запрос:
SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1
Ключевым моментом здесь является то, что последовательность двойных тире -- является индикатором комментария в SQL и означает, что остальная часть запроса интерпретируется как комментарий.
Комментарии, если вы не были в курсе нужны для программистов, для того, чтобы делать различные заметки/пометки в коде, при этом, чтобы они не воспринимались средой как настоящий код. В python, например эквивалентом двойного тире будет "#
"
Это эффективно удаляет остаток запроса, так что он больше не включает AND released = 1. Это означает, что отображаются все продукты, включая еще не выпущенные.
Если пойти дальше, злоумышленник может заставить приложение отобразить все продукты в любой категории, включая категории, о которых он не знает:
https://falcon-bytes.github.io/products?category=Gifts'+OR+1=1--.
В результате получается SQL-запрос:
SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1
В результате такого способа системой будет воспринят запрос:
SELECT * FROM products WHERE category = 'Gifts' OR 1=1
При этом все, что идет после -- будет игнорироваться
Модифицированный запрос вернет все товары, где
либо категория - Gifts, либо 1 равна 1. Поскольку 1=1 всегда истинно, запрос
вернет все товары.
Кроме того, вместо того, чтобы получить какие-то элементы базы данных злоумышленник может пойти еще дальше, и удалить вообще все элементы в таблице, вот пример:
Здесь сайтом предложено окно ввода ID товара, а злоумышленник помимо айди товара вставляет дополнительный запрос, который удаляет всю таблицу.
Подрыв логики приложения
Рассмотрим приложение, которое позволяет пользователям входить в систему с помощью имени пользователя и пароля. Если пользователь вводит имя пользователя falcon и пароль bytes, приложение проверяет учетные данные, выполняя следующий SQL-запрос:
SELECT * FROM users WHERE username = 'falcon' AND password = 'bytes'
Если запрос возвращает данные пользователя, то вход в систему будет успешным. В противном случае он будет отклонен.
Здесь злоумышленник может войти в систему как любой пользователь без пароля, просто используя последовательность комментариев SQL -- для удаления проверки пароля из пункта WHERE запроса. Например, если ввести имя пользователя administrator'-- и пустой пароль, то получится следующий запрос:
SELECT * FROM users WHERE username = 'administrator'--' AND password = ''
Этот запрос возвращает пользователя, чье имя пользователя - administrator, и успешно регистрирует атакующего как этого пользователя.
Получение данных из других таблиц базы данных
В случаях, когда результаты SQL-запроса возвращаются в ответах приложения, злоумышленник может использовать уязвимость SQL-инъекции для получения данных из других таблиц базы данных. Для этого используется ключевое слово UNION, которое позволяет выполнить дополнительный запрос SELECT и добавить его результаты к исходному запросу.
Например, если приложение выполняет следующий запрос, содержащий пользовательский ввод "Gifts":
SELECT name, description FROM products WHERE category = 'Gifts'
то злоумышленник может отправить ввод:
' UNION SELECT username, password FROM users--.
Это заставит приложение вернуть все имена пользователей и пароли вместе с названиями и описаниями товаров.
Слепые уязвимости SQL-инъекции
Многие случаи SQL-инъекций являются слепыми уязвимостями. Это означает, что приложение не возвращает результаты SQL-запроса или сведения об ошибках базы данных в своих ответах. Слепые уязвимости все еще могут быть использованы для несанкционированного доступа к данным, но соответствующие техники обычно более сложны и трудновыполнимы.
В зависимости от характера уязвимости и используемой базы данных, для эксплуатации слепых уязвимостей SQL-инъекций можно использовать следующие техники:
- Можно изменить логику запроса, чтобы вызвать заметную разницу в реакции приложения в зависимости от истинности одного условия. Это может включать в себя введение нового условия в некоторую булеву логику или условное срабатывание ошибки, такой как деление на ноль.
- Можно условно вызвать временную задержку в обработке запроса, что позволяет сделать вывод об истинности условия на основе времени, которое требуется приложению для ответа.
- Можно вызвать внеполосное сетевое взаимодействие, используя технику OAST. Эта техника является чрезвычайно мощной и работает в ситуациях, когда другие техники не работают. Часто вы можете напрямую передать данные по внеполосному каналу, например, поместив данные в DNS-поиск для домена, который вы контролируете.
В следующих постах я попробую на практике показать, как работают конкретно разные типы SQL-инъекций. Ну а пока на этом все!
На связи был админ канала Falcon Bytes, надеюсь вы узнали что-нибудь новое.