October 10, 2021

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'--

Это приводит к SQL-запросу:

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:

Видим:

Давайте теперь логин оставим тот же, а к паролю добавим кавычку ('):

SQL-запрос имеет такой вид:

Мы поставили кавычку и появилась ошибка.

Ошибка произошла в этом месте:

password = 'windef''

Своей кавычкой мы закрыли строку, не фильтрация символов привела к ошибке.

Теперь давайте введем windef' or 1=1-- Как мы уже знаем два тире это знак комментария, а значит всё остальное считываться не будет.

Мы вошли:

Запрос имел такой вид:

Как видим, всё остальное было закомментировано)

На этом пока что всё!

Всем спасибо за прочтение!

Подпишитесь на наш канал:

Windef - тык