使用 JDBCConnector 和 StoredProcedures 的 T-SQL SQL 注入

T-SQL SQL injection using JDBCConnector and StoredProcedures

提问人:Borbat 提问时间:8/2/2018 最后编辑:Mark RotteveelBorbat 更新时间:8/3/2018 访问量:47

问:

我想知道是否有可能将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论点,但没有成功。

sql-server t-sql sql 注入

评论

0赞 HABO 8/2/2018
如果不了解如何使用,就很难回答您的问题。@Query
1赞 Borbat 8/2/2018
你的意思是它在程序中是如何使用的?

答:

4赞 Zohar Peled 8/2/2018 #1

不用担心,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

评论

1赞 Cleptus 8/3/2018
关于该做和不该做的好答案