我在SQL服务器中发现了SQL注入错误吗?

GSe*_*erg 4 sql-injection sql-server-2008

所以我正在使用我的MS SQL Server 2008应用程序来查看它对SQL注入有多好的保护.该应用程序允许用户在数据库中创建视图.

现在考虑以下内容:

create view dbo.[]]; drop database foo--] as select 1 as [hi!]
Run Code Online (Sandbox Code Playgroud)

这将创建一个名称为的视图]; 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--';
Run Code Online (Sandbox Code Playgroud)

那些错误还是我错过了一点?

Aar*_*ght 16

你错过了这一点.SQL Server无法保护自己免受SQL注入 - 如果有人可以直接访问您的数据库,那么您已经被pwned了.这是您的应用程序需要通过参数化查询来防止SQL注入,并防止这些类型的语句进入数据库.

  • 此外,这句话:"该应用程序允许用户在数据库中创建视图." 如果您允许不受信任的用户执行DDL语句,那么在我看来,您已经输了. (4认同)
  • @GSerg:因为SQL Server Management Studio有一个突出显示错误的语法?谁在乎?转义SQL不是防止SQL注入的正确方法.数据库安全性101:参数化您的命令. (3认同)

Rem*_*anu 8

  • 1:这只意味着intellisense解析器不能与SQL语法的更精细细节相提并论.虽然它可能是一个intellisense错误,但它不是注射载体.

  • 2:object_id()接受多部分名称,因此如果不明确,它需要引号中的名称: select object_id('[]]; drop database foo--]')