Нашел ли я ошибку SQL-инъекции в SQL-сервере? - PullRequest
4 голосов
/ 25 февраля 2010

Итак, я играл с моим MS SQL Server 2008 приложением, чтобы увидеть, насколько хорошо оно защищено от SQL-инъекций. Приложение позволяет пользователям создавать представления в базе данных.

Теперь рассмотрим следующее:

create view dbo.[]]; drop database foo--] as select 1 as [hi!]

Это создает представление с именем ]; drop database foo--. Он действителен, и вы можете выбрать из него (очевидно, возвращает номер 1).

Странная вещь # 1:

В SQL Management Studio запрос SELECT [hi!] FROM [dbo].[]]; drop database foo--] выделен красным как неправильный, утверждая, что имя объекта недопустимо. Тем не менее, он выполняет и возвращает 1.

Странная вещь # 2:

Вызов OBJECT_ID(']; drop database foo--') возвращает NULL (что означает, что объект не существует), но следующий запрос возвращает информацию о представлении правильно:

select * from sys.objects where name = ']; drop database foo--';

Это ошибки или мне не хватает точки?

Ответы [ 4 ]

16 голосов
/ 25 февраля 2010

Вы упускаете суть. SQL Server не может защитить себя от внедрения SQL - если кто-то имеет прямой доступ к вашей базе данных, то вы уже pwned. Именно ваше приложение должно защищаться от внедрения SQL путем параметризации запросов и предотвращения попадания этих операторов в базу данных.

8 голосов
/ 25 февраля 2010
  • 1: это только означает, что синтаксический анализатор intellisense не соответствует более мелким деталям синтаксиса SQL. Несмотря на то, что это может быть ошибка intellisense, это не вектор внедрения.

  • 2: object_id () принимает многокомпонентные имена, поэтому ему нужно имя в кавычках, если неоднозначно: select object_id('[]]; drop database foo--]')

0 голосов
/ 25 февраля 2010

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

Тот факт, что вы "должным образом избежали"] (путем подстановки с помощью]]) на самом деле не имеет значения - вы позволяете использовать пользовательский ввод как что-либо еще, но значение по определению означает, что вы допускаете внедрение SQL.

0 голосов
/ 25 февраля 2010

Это все равно, что использовать свой ключ, чтобы сесть в машину, а затем сказать: «Эй, дыра в безопасности, мне разрешено украсть радио»

...