Как стать автором
Обновить

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

Автор оригинала: 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/

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.