我们正在使用引用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'+'\ test并获得与输入测试时相同的结果。
我们显然需要让他们改变这一点,但我需要首先证明这是一个问题。如何通过将SQL作为@a传入表中来插入行?如果我做
'; INSERT INTO blah VALUES('test')
然后我得到:
Incorrect syntax near ';'.
答案 0 :(得分:4)
是的,它很脆弱,但是你偶然注入了错误的文本,产生了语法错误:
SELECT * FROM test WHERE x = "1" AND a =; INSERT INTO blah VALUES('test')
^--your syntax error
如果您的注射文本是:
a; INSERT blah blah blah
^---
那么你最终会得到两个有效的查询,并在你的表格中test
。
答案 1 :(得分:0)
是的,您可以将@设置为具有secape字符,从而创建多个Execs,导致execcmd格式C:或其他 - 谷歌SQL注入攻击
然而:
创建proc db.eg @a nvarchar(255)
AS BEGIN
更新Mytable SET Mycol = @a WHERE条件等..
END
由于字符串直接进入表列,因此不会对SQL注入开放,它是非执行