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注入,并防止这些类型的语句进入数据库.
select object_id('[]]; drop database foo--]')