SQL UNION Injection

Общее представление об атаке SQL UNION Injection

Реализуется в случае, если результаты SQL-запроса возвращаются в ответе приложения. Ответы могут быть разными: ошибки приложения, ошибки сервера, результаты запросов и другие.

Оператор UNION позволяет запускать один и более SELECT-запросов. Например:

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

Данный SQL-запрос вернет один ответ с двумя столбцами, содержащими значения из столбцов a и b в table1 и столбцов c и d в table2.

Чтобы успешно выполнить атаку, необходимо знать:

  • Сколько столбцов возвращается из исходного запроса

  • Тип данных каждого столбца

Определение количества столбцов:

Есть два способа определения количества столбцов: через ORDER BY и UNION SELECT.

Первый способ - ORDER BY:

' ORDER BY 1 -- - (200 OK)
' ORDER BY 2 -- - (200 OK)
' ORDER BY 3 -- - (200 OK)
' ORDER BY 4 -- - (500 ERROR)

В таблице 3 столбца, так как ' ORDER BY 4 выдает ошибку.

Второй способ - UNION SELECT:

Перебираем NULL, пока не получим 200 ОК, т.к. без ошибок

Используем NULL, потому что NULL подходит для всех типов данных.

Определение типа данных каждого столбца:

Использование внутренних функций базы данных:

Когда мы знаем количество столбцов, мы можем сделать данную вещь:

Ответ может быть примерно таким(вместо вывода имени пользователя выводится результат функции version()):

Некоторые функции из MySQL:

Последовательность действий для выполнения успешной атаки

  • Определяем количество столбцов

  • Определяем тип данных каждого столбца

  • Выводим все базы данных:

  • Выводим все таблицы из базы данных database1

  • Выводим все колонки из таблицы table1, которая находится в базе данных database1:

  • Выводим все данные username, password, email из таблицы table1, которая находится в базе данных database1:

1337 - например, параметр id, но важно, чтобы такого значения не было в таблице (или можно использовать -1).

LFI без вывода с помощью UNION SQL Injection

Запись в файлы с помощью UNION SQL Injection

Reverse Shell с помощью UNION SQL Injection

Находим папку сервера с помощью конфига веб-сервера.

Для Nginx:

Для Apache:

Теперь записываем туда шелл:

Обход фильтров

Запрещено [ , ' ( ) + = \ " ] + и пробел:

Вместо пробела можно использовать /**/, а вместо where name='b548d45080b9d110' использовать where name like 0x62353438643435303830623964313130:

Запрещено все, кроме символов: a-z A-Z 0-9 ' ( ) , ] + и обход защиты от select:

Так как в таблице очень много флагов и нам нужен флаг с name=3f1a76e536a0a805, то нужно указать фильтр вывода, например, where name='3f1a76e536a0a805', но знак = запрещен, следовательно можно использовать LIKE вместе с хексовым значением name:

Запрещено все, кроме символов: a-z A-Z 0-9 ' ( ) * и обход защиты от select:

Так как мы не можем перебрать количество колонок через union select null,<null>,<...>, то можно это сделать через JOIN AS:

Ответ:

Пробуем добавить еще одну колонку:

И в ответе мы получаем флаг

Запрещен SELECT полностью:

Можно использовать SELSELECTECT, если фильтры единоразово вырезают SELECT без цикла:

Last updated

Was this helpful?