3

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

2 回答 2

4

是的,它很容易受到攻击,但是您碰巧注入了错误的文本,从而产生了语法错误:

SELECT * FROM test WHERE x = "1" AND a =; INSERT INTO blah VALUES('test')
                                        ^--your syntax error

如果您的注入文本是:

a; INSERT blah blah blah
^---

那么你最终会得到两个有效的查询并test在你的 blah 表中。

于 2012-11-26T16:32:09.953 回答
0

是的,您可以将您的 @ 设置为具有一个 secape 字符,从而创建多个 Execs 最终导致 execcmd 格式 C: 或其他 - 谷歌 SQL 注入攻击

然而:

创建 proc db.eg @a nvarchar(255)

开始

更新 Mytable SET Mycol = @a WHERE Con​​dition 等。

结尾

由于字符串直接进入表列,因此未对 SQL 注入开放,它是 nt exec'd

于 2012-11-26T16:36:31.263 回答