我们正在使用引用 MSSQL 中的存储过程的第三方产品。这个存储过程看起来像这样:
CREATE PROCEDURE [dbo].[example]
@a nvarchar(255)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @strSQL nvarchar(3000)
SET @strSQL = 'SELECT * FROM test WHERE x = ''1'''
IF IsNull(@a, '') <> ''
SET @strSQL = @strSQL + ' AND a = ''' + @a + ''''
EXEC(@strSQL)
END
这个存储过程实际上并没有将其结果输出到网站,但我仍然确定它容易受到 SQL 注入的攻击。我可以输入 t' + 'est 并得到与输入 test 相同的结果。
我们显然需要让他们改变这一点,但我需要首先证明这是一个问题。如何通过将 SQL 作为@a 传入来执行诸如在表中插入行之类的操作?如果我做
'; INSERT INTO blah VALUES('test')
然后我得到:
Incorrect syntax near ';'.