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, наконец-то ошибки не будет и лаба будет считаться решенной
