Найти в Дзене
ЗА ИБАС

[PortSwigger, 3/16 SQLi] Атака UNION с внедрением SQL, определяющая количество столбцов, возвращаемых запросом

А мы продолжаем ряд статей по решению лабораторных работ на PortSwigger Academy! Сегодня у нас в разборе - SQL injection UNION attack, determining the number of columns returned by the query А теперь время налить духоты Что такое UNION и как им пользоваться Когда приложение уязвимо для SQL-инъекций и результаты запроса возвращаются в ответах приложения, можно использовать ключевое слово UNION для извлечения данных из других таблиц в базе данных. Это приводит к атаке UNION с внедрением SQL.
Ключевое слово UNION позволяет выполнить один или несколько дополнительных запросов SELECT и добавить результаты к исходному запросу. Например:
SELECT a, b FROM table1 UNION SELECT c, d FROM table2
Этот SQL-запрос вернет один результирующий набор с двумя столбцами, содержащими значения из столбцов a и b в таблице1 и столбцов c и d в таблице2. Чтобы запрос UNION работал, должны быть выполнены два ключевых требования: Чтобы выполнить атаку UNION с внедрением SQL-кода, вам необходимо убедиться, что
Оглавление

А мы продолжаем ряд статей по решению лабораторных работ на PortSwigger Academy! Сегодня у нас в разборе - SQL injection UNION attack, determining the number of columns returned by the query

Lab: SQL injection UNION attack, determining the number of columns returned by the query | Web Security Academy

А теперь время налить духоты

Что такое UNION и как им пользоваться

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

Ключевое слово UNION позволяет выполнить один или несколько дополнительных запросов SELECT и добавить результаты к исходному запросу. Например:


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

Этот SQL-запрос вернет один результирующий набор с двумя столбцами, содержащими значения из столбцов a и b в таблице1 и столбцов c и d в таблице2. Чтобы запрос UNION работал, должны быть выполнены два ключевых требования:

  • Отдельные запросы должны возвращать одинаковое количество столбцов.
  • Типы данных в каждом столбце должны быть совместимы между отдельными запросами.

Чтобы выполнить атаку UNION с внедрением SQL-кода, вам необходимо убедиться, что ваша атака соответствует этим двум требованиям. Обычно это включает в себя выяснение:

  • Сколько столбцов возвращается из исходного запроса?
  • Какие столбцы, возвращенные исходным запросом, имеют подходящий тип данных для хранения результатов введенного запроса?

Определение количества столбцов, необходимых для атаки UNION с SQL-инъекцией

При выполнении атаки UNION с внедрением SQL-кода существует два эффективных метода определения количества столбцов, возвращаемых исходным запросом.

Первый метод включает в себя вставку ряда предложений ORDER BY и увеличение указанного индекса столбца до тех пор, пока не произойдет ошибка. Например, если предположить, что точка внедрения — это строка в кавычках в предложении WHERE исходного запроса, вы должны отправить:

' ORDER BY 1
' ORDER BY 2
' ORDER BY 3
etc

Эта серия полезных данных изменяет исходный запрос, чтобы упорядочить результаты по разным столбцам в результирующем наборе. Столбец в предложении ORDER BY можно указать по его индексу, поэтому вам не нужно знать имена каких-либо столбцов. Когда указанный индекс столбца превышает количество фактических столбцов в результирующем наборе, база данных возвращает ошибку, например:

The ORDER BY position number 3 is out of range of the number of items in the select list.

Приложение может фактически вернуть ошибку базы данных в своем HTTP-ответе, или общую ошибку, или просто не вернуть никаких результатов. Если вы можете обнаружить некоторую разницу в ответе приложения, вы можете сделать вывод о том, сколько столбцов возвращается из запроса.

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

' UNION SELECT NULL--
' UNION SELECT NULL, NULL--
' UNION SELECT NULL, NULL, NULL--
и т.п.

Если количество нулей не соответствует количеству столбцов, база данных возвращает ошибку, например:

All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

Опять же, приложение может на самом деле вернуть это сообщение об ошибке или может просто вернуть общую ошибку или никаких результатов. Когда количество пустых значений совпадает с количеством столбцов, база данных возвращает дополнительную строку в результирующем наборе, содержащую нулевые значения в каждом столбце. Влияние на результирующий HTTP-ответ зависит от кода приложения. Если вам повезет, вы увидите дополнительный контент в ответе, например дополнительную строку в таблице HTML. В противном случае нулевые значения могут вызвать другую ошибку, например исключение NullPointerException. В худшем случае ответ может быть неотличим от ответа, вызванного неправильным количеством нулей, что делает этот метод определения количества столбцов неэффективным.

Постановка задачи самой лабораторной

Эта лабораторная работа содержит уязвимость SQL-инъекции в фильтре категорий продуктов. Результаты запроса возвращаются в ответе приложения, поэтому вы можете использовать атаку UNION для извлечения данных из других таблиц. Первым шагом такой атаки является определение количества столбцов, возвращаемых запросом. Затем вы будете использовать эту технику в последующих лабораторных работах для построения полной атаки.

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

Решение лабы, конец близок!

Нас встречает тестовый стенд

-2

Попробуем ввести SQL-инъекцию используя второй метод, описанный в теоретической части, которую вы скипнули
Сначала проверим, что сервис уязвим к SQL-инъекциям, и введем следующую url строку

https://0ae500cd0333d86bc06cdb91008000bc.web-security-academy.net/filter?category=Pets' UNION SELECT NULL--

Видим, что сервис уязвим

-3

И теперь до победного добавляем NULL`и пока не достигнем победного

И вау, чудо! Мы смогли, введя

https://0ae500cd0333d86bc06cdb91008000bc.web-security-academy.net/filter?category=Pets' UNION SELECT NULL, NULL, NULL--
-4

Искренне выражаю уважение тому единственному, кто это смог дочитать, это было сложно и душно, знаю.

И постоянно помним, что все это выполняется исключительно в рамках пониманий действий злоумышленников в инфраструктурах, за которые МЫ ОТВЕТСТВЕННЫЕ, а не хекерства ради!

-5