SQL injection для чайников
⚠️ Автор не призывает к использованию полученных знаний в практических целях и не несет ответственности за любой возможный вред, причиненный материалом ⚠️
Всем привет. В этой статье мы поговорим про SQLi.
SQL injection/SQLi/скуля - атака, которая позволяет злоумышленнику вмешиваться в запросы, которое приложение делает к своей базе данных (бд). Обычно это позволяет просматривать данные (логины, пароли и др).
Глупый пример из жизни:
Отец, написал в записке маме, чтобы она дала Васе 100 рублей и положил её на стол. Переработав это в шуточный SQL язык, мы получим:
ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе
Так-как отец плохо написал записку (Корявый почерк), и оставил её на столе, её увидел брат Васи — Петя. Петя, будучи хакер, дописал там «ИЛИ Пете» и получился такой запрос:
ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе ИЛИ Пете
Мама прочитав записку, решила, что Васе она давала деньги вчера и дала 100 рублей Пете. Вот простой пример SQL инъекции из жизни)
Теория на практике
Сайт для покупок, когда пользователь выбирает раздел подарки, то его браузер запрашивает такой URL:
https://insecure-website.com/products?category=Gifts
Это заставляет приложение сделать запрос к базе данных, он будет иметь такой вид:
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
Этот SQL-запрос просит базу данных вернуть:
- все подробности (*)
- из таблицы продуктов (FROM products)
- где категория "Подарки" (category = 'Gifts')
- и выпущен - 1.
Ограничение released = 1
используется, чтобы скрыть продукты, которые не выпущены. Например, для неизданных продуктов released = 0
.
На сайте не реализована защита SQL-инъекций, поэтому злоумышленник может создать такую атаку, как:
https://insecure-website.com/products?category=Gifts'--
SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1
Ключевым моментом здесь является то, что последовательность с двойным тире --
является индикатором комментария в SQL и означает, что остальная часть запроса не считывается. Это эффективно удаляет оставшуюся часть запроса, поэтому он больше не включает AND released = 1
. Это означает, что отображаются все продукты, включая неизданные.
Далее злоумышленник может заставить приложение отображать все продукты в любой категории, включая категории, о которых он не знает:
https://insecure-website.com/products?category=Gifts'+OR+1=1--
SQL-запрос будет иметь такой вид:
SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1
Измененный запрос вернет все элементы, в которых либо категория «Подарки», либо 1 равно 1. Поскольку 1=1
всегда верно, запрос вернет все элементы.
Обход авторизации
Сейчас будет ещё один пример SQLi: обход авторизации.
Все видели поля для авторизации на сайтах, где нужно ввести логин и пароль. Сейчас увидим как с помощью SQL injection можно обойти авторизацию.
Сверху поле авторизации, снизу мы будем смотреть какой вид получит SQL запрос. Давайте введем [email protected] & windef:
Давайте теперь логин оставим тот же, а к паролю добавим кавычку ('):
Мы поставили кавычку и появилась ошибка.
Ошибка произошла в этом месте:
Своей кавычкой мы закрыли строку, не фильтрация символов привела к ошибке.
Теперь давайте введем windef' or 1=1--
Как мы уже знаем два тире это знак комментария, а значит всё остальное считываться не будет.
Как видим, всё остальное было закомментировано)