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?