May 1, 2023

SQL-инъекции для новичков

Приветствую, друзья🥷

В этой статье мы поговорим о тестировании на проникновение, а именно разберем SQL-инъекции.

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

Это дает возможность просматривать скрытые данные, которые мошенник может изменять или удалять. Этими действиями он вызывает постоянные изменения в содержимом или поведении приложения.

Другой пример, когда преступник усиляет атаку SQL-инъекции, чтобы скомпрометировать базовый сервер или другую внутреннюю инфраструктуру, а также провести атаку типа DDOS.

Последствия атаки SQL-инъекции

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

Виды SQL-инъекций

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

  1. Получение скрытых данных при помощи изменения SQL-запроса
  2. Изменение запроса, чтобы вмешаться в логику работы приложения
  3. Атаки UNION для получения данных из разных таблиц базы данных
  4. Изучение базы данных для поиска информации о версии и структуре базы данных
  5. «Слепая» SQL-инъекция, при которой результаты контролируемого запроса не возвращаются в ответах приложения

Получение скрытых данных

Для примера возьмем приложение для шопинга, которое выдает товары в различных категориях. При выборе категории «Подарки», браузер пользователя запрашивает URL-адрес:

https://uhahatbltv.com/?category=Gifts

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

SELECT * FROM products WHERE category = 'Gifts' AND released = 1

Этот SQL-запрос просит базу данных вернуть:

все данные (*) из таблицы продуктов где категория - "Подаркии" released = 1.

Ограничение released = 1 применяется для скрытия продуктов, которые не выпущены. Для невыпущенных продуктов — released = 0.

В приложении нет защиты от атак SQL-инъекций, поэтому потенциальный преступник может построить атаку:

https://uhahatbltv.com/products?category=Gifts'--.

В результате получится SQL-запрос:

SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1

Важный момент — последовательность двойных тире -- является индикатором комментария в SQL и означает, что остальная часть запроса поясняется как комментарий. Благодаря этому запрос больше не включает AND released = 1. А значит, что отображаются все продукты, включая еще не выпущенные.

Если углубляться далее, преступник может заставить приложение показать вообще все продукты из всех категорий (включая категории, о которых он не знает):

https://uhahatbltv.com/products?category=Gifts'+OR+1=1--.

В результате получается SQL-запрос:

SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1

Такой запрос вернет все товары, где категория — Gifts, либо 1 = 1. Поскольку 1 = 1 всегда истинно, запрос
вернет все товары.

Подрыв логики приложения

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

SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'

Если запрос возвращает данные пользователя, то произойдет вход в систему. Иначе он будет отклонен.

В этом случае мошенник может войти в систему точно также, как любой пользователь без пароля, используя последовательность комментариев SQL -- для удаления проверки пароля из пункта WHERE запроса. Например, при вводе имени пользователя administrator'-- и пустой пароль, получится следующее:

SELECT * FROM users WHERE username = 'administrator'--' AND password = ''

Этот запрос возвращает пользователя - administrator и регистрирует атакующего как этого пользователя.

Получение данных из других таблиц базы данных

Разберем ситуацию, когда результаты SQL-запроса возвращаются в ответах приложения. Если использовать эту уязвимость, можно получить данные из других таблиц базы данных. Для этого используется ключевое слово UNION, позволяющее выполнить дополнительный запрос SELECT и добавить его результаты к исходному запросу. Например, если приложение выполняет следующий запрос с пользовательским вводом "Gifts":

SELECT name, description FROM products WHERE category = 'Gifts'

то злоумышленник может сделать так:

' UNION SELECT username, password FROM users--.

После такого вмешательства в запрос, приложение выведет все имена пользователей и пароли вместе с названиями и описаниями товаров.

Изучение базы данных

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

Есть способ запросить информацию о версии базы данных. Например, в Oracle вы можете выполнить:

SELECT * FROM v$version

Есть способ узнать, какие таблицы базы данных существуют, и какие столбцы они содержат. Например, для большинства баз данных выполняется следующий запрос для вывода списка таблиц:

SELECT * FROM information_schema.tables

Слепые уязвимости SQL-инъекции

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

Есть несколько техник, которые вы можете использовать для эксплуатации слепых уязвимостей SQL-инъекций, в зависимости от характера уязвимости и используемой базы данных

1 способ

Изменить логику запроса и вызвать разницу в реакции приложения в зависимости от истинности одного условия. Это можно реализовать с помощью введения нового условия. Например, условное срабатывание ошибки, такой как деление на ноль.

2 способ

Возможно вызвать временную задержку в обработке запроса. Это позволит сделать вывод об истинности условия на основе времени, которое требуется приложению для ответа.

3 способ

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


Теперь вы знаете, что такое SQL-инъекции, какие типы бывают и как их использовать.


​​​​​​🔥 Ставь реакцию, если понравилась статья ​

​​​​​​​​​​​​​​​​​​​​⚡️Остались вопросы? Пиши - @golden_hpa