SQL-инъекции для новичков
В этой статье мы поговорим о тестировании на проникновение, а именно разберем SQL-инъекции.
SQL-инъекция (SQLi) — это уязвимость веб-безопасности, которая позволяет злоумышленнику вмешиваться в запросы, которые приложение делает к своей базе данных.
Это дает возможность просматривать скрытые данные, которые мошенник может изменять или удалять. Этими действиями он вызывает постоянные изменения в содержимом или поведении приложения.
Другой пример, когда преступник усиляет атаку SQL-инъекции, чтобы скомпрометировать базовый сервер или другую внутреннюю инфраструктуру, а также провести атаку типа DDOS.
Последствия атаки SQL-инъекции
Успешно проведенная атака SQL-инъекции часто открывает доступ к конфиденциальным данным (пароли, данные кредитных карт или личная информация пользователей). Большинство крупнейших сливов данных за последние годы были проведены при помощи атак с использованием SQL-инъекций. Случается, что преступник таким способом получает постоянный доступ к внутренней системе организации. Это создает долгосрочную угрозу, которую могут не замечать очень длительное время.
Виды SQL-инъекций
Есть большое количество уязвимостей, атак и методов SQL-инъекций, которые возникают в различных ситуациях. Вот некоторые из них:
- Получение скрытых данных при помощи изменения SQL-запроса
- Изменение запроса, чтобы вмешаться в логику работы приложения
- Атаки UNION для получения данных из разных таблиц базы данных
- Изучение базы данных для поиска информации о версии и структуре базы данных
- «Слепая» 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