Можно ли запустить атаку SQL-инъекцией на многострочный запрос? - PullRequest
0 голосов
/ 24 мая 2019

Предположим, у меня есть многострочный SQL-запрос, который принимает данные от пользователя. Можно ли прервать использование стандартной SQL-инъекции через комментарии?

Это для запроса Microsoft SQL Server, который принимает пользовательский ввод через Loopback API. Поскольку один и тот же пользовательский ввод используется в нескольких местах, я не могу написать ввод, который создает действительный запрос SQL для запуска атаки с использованием инъекций.

Отредактированный код:

SELECT Field_Name
FROM Table_Name
WHERE  Field_Name != 'Hardcoded Value' AND (
                Field_1 LIKE '%userinput%' OR
                Field_2 LIKE '%userinput%' OR
                Field_3 LIKE '%userinput%' OR
                Field_4 LIKE '%userinput%'
            ) 

Обратите внимание, что userinput - это фактический ввод от внешнего интерфейса, используемый между двумя подстановочными знаками.

Запуск этого кода с пользовательским вводом ' DROP TABLE USERS; -- произойдет ошибка из-за операторов OR.

Разрывается ли этот запрос с помощью SQL-инъекции?

Ответы [ 2 ]

4 голосов
/ 24 мая 2019

Да, это возможно, вам просто нужно немного больше изобретательности.Злоумышленник может легко определить форму вашего запроса, просто попробовав больше материала и посмотрев ошибки (или вывод страницы, создав целевые значения SELECT s).Если мы установим userinput в

'); DROP TABLE [BobbyTables]; SELECT 1 FROM Table_Name WHERE ('' = '

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

SELECT Field_Name
FROM Table_Name
WHERE  Field_Name != 'Hardcoded Value' AND (
    Field_1 LIKE '%'); DROP TABLE [BobbyTables]; SELECT 1 FROM Table_Name WHERE ('' = '%' OR
    Field_2 LIKE '%'); DROP TABLE [BobbyTables]; SELECT 1 FROM Table_Name WHERE ('' = '%' OR
    Field_3 LIKE '%'); DROP TABLE [BobbyTables]; SELECT 1 FROM Table_Name WHERE ('' = '%' OR
    Field_4 LIKE '%'); DROP TABLE [BobbyTables]; SELECT 1 FROM Table_Name WHERE ('' = '%'
) 

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

1 голос
/ 24 мая 2019

Это хороший вопрос, основанный на некоторых чрезвычайно распространенных заблуждениях .

Есть две вещи: возможная инъекция и фактический эксплойт , и очень важно не перепутать их.

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

Если вы не можете придумать полезного эксплойта, это не значит, что инъекция не существует. Оно делает. И как только это произойдет, эксплойт будет найден, так или иначе. Относительно того, является ли ваш запрос многострочным, разрешен ли комментарий, запрещены ли какие-либо символы или какие-либо другие ограничения, абсолютно не имеет значения число эксплойтов бесконечно , и если тысяча эксплойтов не сработает, то будет работать первая тысяча.

Итак, теперь вы можете сказать, что (не) известный ' DROP TABLE USERS; эксплойт не является синонимом SQL-инъекции. Это только один из бесконечного числа возможных эксплойтов.

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

Итак, что за вынос из этой напыщенной речи?

Да, этот запрос можно разрушить с помощью SQL-инъекции, с фатальными последствиями.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...