Web #1: SQL Injection

Web #1: SQL Injection


Где найти лабы: ТЫК


Что такое SQL-инъекция?

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


#1. Простейшая SQL-инъекция

Ссылка: ТЫК

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

В условии лабы нам заранее предоставляется какой запрос используется в базе данных

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

https://<ID>.web-security-academy.net/filter?category=Clothing%2c+shoes+and+accessories

Не трудно заметить, что в запросе есть параметр category, на который можно повлиять

И если подставить в category следующую строку:

Будут получены абсолютно все карточки товаров, что есть в базе данных и лаба будет решена.

Почему это работает?

Подставим строку, из category в запрос базы данных(плюсы заменяются на пробелы)

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

Получается, что значение category пустое и при этом добавилось выражение OR 1=1--

Два тире в SQL обозначают комментарий, и все что идет после этих символов - игнорируется программой

То-есть, на выходе получен запрос, который можно прочитать как:
Выбрать из базы данных products товары для которых верно, что (category = '' ИЛИ 1 = 1)

Благодаря 1 = 1 выражение всегда истинно, а следовательно - будут предоставлены все данные из базы


#2. UNION SQL-инъекция

Ссылка: ТЫК

Команда UNION в SQL позволяет объединять два и более SELECT-запросов в единый набор данных. Похожим образом на прошлую задачу UNION запросы можно добавить через инъекцию.

У UNION есть особенность, что количество столбцов данных в обоих SELECT-запросах должно быть одинаковым. В данной лабе требуется с помощью UNION определить количество столбцов данных в изначальном запросе

Основная страница снова представляет из себя интернет-магазин с возможностью выбора категорий


Как и в прошлой работе, первым делом требуется выбрать категорию и посмотреть, какой запрос на сервер проводится

https://<ID>.web-security-academy.net/filter?category=Lifestyle

В этом задании, оригинального запроса к базе данных не предоставляется, но это и не нужно

Логично предположить, что в данном задании имеется запрос вроде:

SELECT a FROM table1 WHERE category = 'USER_DATA'

Учитывая, что в задании требуется определить количество столбцов в базе данных, можно уверенно говорить, что параметр "a" не единственный. То-есть запрос может выглядеть и так:

SELECT a, b, c, d FROM table1 WHERE category = 'USER_DATA'

Именно количетсво параметров, то-есть количество столбцов и нужно определить через UNION запрос.


Взглянем, как выглядит типичный UNION запрос:

SELECT a, b FROM table1 UNION SELECT c, d FROM table2

Если количество параметров в первом SELECT отлично от количества параметров во втором SELECT - запрос не будет выполнен и вернет ошибку

То-есть. по наличию ошибки, можно определить правильность выбора количества столбцов


Составим запрос, который будет взять за основу

UNION SELECT NULL

Почему пишется SELECT NULL, а не условно SELECT t FROM table?

Потому, что NULL можно применять как "заполнитель" пустого пространства, без обращения к таблице. Но при этом он продолжает считаться столбцомПреобразуем запрос, чтобы он уже был инъекцией:

'+UNION+SELECT+NULL--

Как и в прошлом задании, пробелы заменяются на "+", добавляется ' для закрытия category в оригинальном запросе, и добавляется комментарий, чтобы "обрубить" оставшийся после инъекции запрос

Подставив это в category получится ссылка такого вида:

https://<ID>.web-security-academy.net/filter?category='+UNION+SELECT+NULL--

Если отправить этот запрос, то будет получена ошибка

Значит, количество столбцов подобрано неправильноПопробуем добавить еще один NULL:

https://<ID>.web-security-academy.net/filter?category='+UNION+SELECT+NULL,NULL--

Будет получена такая же ошибка, значит все еще не совпадающее количество столбцов

Добавив третий NULL, наконец-то ошибки не будет и лаба будет считаться решенной



Report Page