[PortSwigger, 1/16 SQLi] Уязвимость SQL-инъекций в предложении WHERE, позволяющая извлекать скрытые данные
Вступление
Не знаю, какие принято писать слова перед разбором лаб с различных образовательных ресурсов, но сегодня мы будем решать нашу первую лабораторную работу на PortSwigger Academy! https://portswigger.net/web-security/sql-injection/lab-retrieve-hidden-data

Постановка задачи
Эта лабораторная работа содержит уязвимость SQL-инъекции в фильтре категорий продуктов. Когда пользователь выбирает категорию, приложение выполняет следующий SQL-запрос:
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
Чтобы решить лабораторную задачу, выполните атаку с внедрением SQL-кода, которая заставит приложение отображать сведения обо всех продуктах в любой категории, как выпущенных, так и не выпущенных.
Душная теория, которую ты пропустишь
Нас встречает онлайн-магазин, над которым мы будем издеваться учиться использовать SQL - инъекции

И при нажатии на различные категории видим, что URL страницы изменяется https://0abc00b403d39d85c0ce08a40091006d.web-security-academy.net/filter?category=Pets
При каждом запросе из браузера, делается запрос в местную БД
SELECT * FROM products WHERE category = 'Pets' AND released = 1
И если у приложения нет защиты от атак SQL-инъекций, то мы можем построить атаку следующим образом:
https://0abc00b403d39d85c0ce08a40091006d.web-security-academy.net/products?category=Pets'--
Это приводит к SQL-запросу:
SELECT * FROM products WHERE category = 'Pets'--' AND released = 1
Важной особенностью является то, что последовательность из двойного тире --
является индикатором комментария в SQL и означает, что остальная часть запроса понимается бэком как комментарий. Это и удаляет оставшуюся часть запроса, поэтому он больше не включает файлы AND released = 1
. Это означает, что отображаются все продукты, включая невыпущенные продукты.
Идя дальше, злоумышленник может заставить приложение отображать все продукты в любой категории, включая категории, о которых он не знает:
https://0abc00b403d39d85c0ce08a40091006d.web-security-academy.net/products?category=Pets'--' OR 1=1--
Это приводит к SQL-запросу:
SELECT * FROM products WHERE category = 'Pets' OR 1=1--' AND released = 1
Модифицированный запрос вернет все элементы, где либо категория «Pets», либо 1 равно 1. Поскольку 1=1
всегда верно, запрос вернет все элементы.
Решение лабораторной работы
Попробуем добавить ' в конце строки, чтобы понять, уязвима ли страница к атакам такого рода, и получаем что она действительно уязвима

Далее, на основе вышеизложенных принципов, введем в URL строку
https://0abc00b403d39d85c0ce08a40091006d.web-security-academy.net/products?category=Pets'--' OR 1=1--

И поздравляю! На этом моменте Вы решили свою первую лабораторную работу на PortSwigger Academy!
Коллегам из SOC
Если у вас KPI завязан на создании новых правил, и вы параноик 80 lvl, что думаете, что вышеизложенная уязвимость доступна в вашей инфре - то вы определенно зашли в нужное место

Правила написаны в синтаксисе EQL (да, это который тот самый эластик), просто потому что скромен и удобен, и перенести его логику на любую другую SIEM у Вас не должно вызвать труда
Не знаю, декодируется ли у вас URL
Возможная логика правила для данной атаки:
url.path: ".*(%27|').*--" and http.response.status_code: 200
а проверить работает ли данная регулярка всегда можно на https://regex101.com/