使用JDBCConnector和StoredProcedures进行T-SQL SQL注入

时间:2018-08-02 13:44:06

标签: sql-server tsql sql-injection

我想知道是否有可能将sql查询注入到过程参数中。我有特殊情况:

ALTER PROCEDURE [Test].[Injection]
  @Query varchar(250) = null
AS
SET NOCOUNT ON
SET @Query = REPLACE(@Query,'','') COLLATE Latin1_General_CI_AI
... more sql code
SELECT * FROM Customers
WHERE (@Query IS NULL OR (Name COLLATE Latin1_General_CI_AI like '%'+@Query+'%'))
ORDER BY ExternalCode ASC

我想使用@Query变量注入sql查询,并可能注释其余代码。使用JDBCConnector通过Web服务调用过程。我尝试通过(以及许多其他组合):

'''abc'','''','''');SELECT * FROM [DummyTable][Dummy];--'

作为@Query参数,但没有解决。

1 个答案:

答案 0 :(得分:4)

不用担心,这样的SQL注入是不可能的。

SQL注入的工作方式是将SQL代码潜入(注入)目标查询。 这与参数是不可能的,因为SQL参数被视为数据而不是代码。您可以在参数内传递所需的任何SQL代码,但不会构成SQL注入威胁。

但是-请注意,如果您在存储过程中使用动态SQL,并将参数连接到SQL字符串中,则您的查询容易受到SQL注入攻击

此代码不安全!

DECLARE @Sql nvarchar(max) = N'SELECT * FROM Customers
WHERE ('+ @Query +' IS NULL '....

EXEC(@SQL)

要在SQL Server中安全地运行动态SQL,可以使用sp_executeSql并将参数作为参数传递:

DECLARE @Sql nvarchar(max) = N'SELECT * FROM Customers
WHERE (@TheQuery IS NULL '....

EXEC sp_ExecuteSql 
     @Sql, 
     N'@TheQuery varchar(250)',
     @TheQuery = @Query