SQL инъекции. Стек запросов

Возможность выполнять стек запросов даёт большой простор действий для злоумышленника. По завершение основного запроса выполняется новый запрос, с помощью которого можно изменить данные или вызвать хранимые процедуры.

Принцип работы

В SQL запросах «;» является признаком завершения запроса и начала нового. Это позволяет выполнить несколько запросов в за один запрос к базе данных. В отличие от UNION SQL инъекции, которая позволяет выполнять только SELECT запросы, стек запросов позволяет выполнять любые запросы и процедуры. Самый стандартный пример использования данной техники:

Инъекция:

Полученный код:

В результате чего будет сделан нужный select, а затем будет удалены все данные из таблицы products.

Ограничения при использовании

Важно упомянуть, что стек запросов не работает в некоторых ситуациях. Часто, данный тип инъекций не возможен, потому что   база данных не поддерживает данный функционал или просто не хватает прав для использования стека.

Несмотря на то, что ранее писал что можно использовать любые типы запросов, но на деле сталкиваемся с проблемами при попытке использовать SELECT. В этом случае будут выполнены оба запроса, но базы/апи спроектированы так, что возвращают результат выполнения только одного запроса. Вследствие этого, «инъектированный» запрос породить ошибки, либо просто пустой ответ. Поэтому, в случае необходимости выполнения SELECT, следует использовать UNION инъекции.

Изменение данных

Пример, показанный в начале статьи, прекрасно иллюстрирует как мы можем манипулировать данными используя стеки запросов. Но обычно злоумышленники не удаляют данные, а с помощью ALTER запросов стараются поднять права пользователю в системе. Самая частая практика — это изменение пароля администратора.  Пример показывает стандартный запрос на изменение данных

Инъекция:

Получившийся запрос:

После выполнения данного запрос, пароль (если же он конечно хранился в открытом виде) будет изменен, и злоумышленник спокойно сможет авторизоваться.

Вызов хранимых процедур

Возможность вызова процедур серьезно поднимает уровень опасности инъекции. Сейчас, многие БД поставляются с процедурами и функциями для более простой разработки и написания нового функционала. Следовательно, это даёт доступ к сети, функционалу ОС и файловой системы.

Посколько между БД нету соглашений по именованию процедур, злоумышленнику для начала необходимо будет определить БД. Ну а после этого, все так же как и в других примерах. Посмотрим как можем вызвать xp_shellcmd, процедура SQL Server, позволяющая выполнить команду в ОС.

Инъекция:

Запрос:

Запрос выполнит SELECT и удалить файл important_file.txt. Более сложные атаки могут быть выполнены с помощью процедур и получить полный доступ для сервера.

 


Есть что написать?