这容易受到SQL注入吗?

时间:2012-11-26 16:29:14

标签: sql-injection

我们正在使用引用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 ';'.

2 个答案:

答案 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注入开放,它是非执行