2012-11-26 144 views
3

我們正在使用引用MSSQL中的存儲過程的第三方產品。該存儲過程看起來是這樣的:這是否容易受到SQL注入?

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並獲得與輸入測試相同的結果。

我們顯然需要讓他們改變這一點,但我需要先證明它是一個問題。我怎樣才能做一些事情,例如通過傳遞SQL作爲@a來插入一行到表中?如果我做

'; INSERT INTO blah VALUES('test') 

然後我得到:

Incorrect syntax near ';'. 
+0

它幾乎看起來像SQL自動防止分號被輸入?這是SQL2012 – JoeS

+0

啊,修復它 - 謝謝。 – JoeS

回答

4

是的,它是脆弱的,但碰巧你已經注入了錯誤的文字,產生語法錯誤:

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

如果您的注射文本爲:

a; INSERT blah blah blah 
^--- 

那麼你最終會在兩張有效的查詢中輸入test

+0

嗯,但它看起來應該結束爲SELECT * FROM test WHERE x =「1」AND a ='';插入blah VALUES('test') – JoeS

0

是的,你可以設置你的@有一個secape特性,並因此ulimately創建多發高層導致execcmd格式C:或其他 - 谷歌SQL注入攻擊

但是:

創建PROC db.eg @a爲nvarchar(255)

AS BEGIN

更新MyTable的SET Mycol = @a WHERE條件等。

END

不是開放的SQL注入作爲字符串直接到表列,它是NT exec'd

相關問題