2017-01-09 29 views
-2

需要以下SQL注入問題的幫助:帶有參數化過程的SQL注入

以下是參數化存儲過程的一個版本。排除如何從應用程序調用它,是否有阻止@ v_string被視爲動態SQL?

我認爲這相當水密 - 沒有執行或連接的SQL,但仍然插入分號允許返回其他數據。

我知道有多個層面來考慮這個問題,但我想知道是否有一些簡單的解決方案,我錯過了這裏,因爲大多數注入修復涉及動態查詢。

create table dbo.Employee (EmpID int,EmpName varchar(60)) 


declare 
    @v_id int, 
    @v_string varchar(60) 
begin 

    set @v_string='test'''; waitfor delay '0:0:5' -- 

    if @v_id is null 

    begin 
     set @v_id =   (select EmpID 
           from  Abc.Employee 
           where [email protected]_string); 
    end 


    print @v_id 
end 
+0

如果SP使用查詢中由用戶直接提供的參數,並且它們直接連接到select語句中(而不是參數)。 –

+0

「插入分號允許返回其他數據。」我看不出會發生什麼。你能告訴我們關於你在哪裏插入這個分號的細節,以及你如何知道額外的數據因爲它而被返回? –

+0

用select * from sys.databases替換waitfor延遲 –

回答

2

反正是有防止被視爲動態 SQL @v_string?

我不希望@v_string被當作這裏的動態SQL,因爲T-SQL代碼有沒有EXECUTEEXECUTE sp_executeSQL。該值不會被執行,但會被視爲不容易受SQL注入攻擊的WHERE子句值。

如果這不能解答您的問題,請發佈一個完整的示例,演示將該值視爲動態SQL。

+0

爲簡潔起見,它的設置如下:@ v_string ='test'''; waitfor延遲'0:0:5' - 是傳入的值。就我所能看到的時間而言,第二組執行時執行注入的SQL –

+0

@v_string值傳遞給查詢,但值內不執行。更新後的問題中的代碼不會顯示您擔心的問題。 –

2

你被你自己的測試弄糊塗了。行:

set @v_string='test'''; waitfor delay '0:0:5' -- 

是創建一個字符串@v_string與價值test',然後執行waitfor delay '0:0:5'然後您的實際Employee查詢正在運行。

所以,如果你按原樣運行查詢,請與您的額外例如:

set @v_string='test'''; select * from sys.databases 

...會發生什麼是代碼該行會設置@v_stringtest',然後立即執行select * from sys.databases。然後,其餘的代碼將運行,執行您的實際選擇。所以,你會看到select * from sys.databases結果,其次是你的Employee查詢的結果,但僅僅是因爲你實際上硬編碼的聲明select * from sys.databases到你的程序沒有意識到這一點:)

如果你希望字符串@v_string要設置爲test'; waitfor delay '0:0:5'那麼你的got the string quoting錯了。它應該是:

set @v_string='test''; waitfor delay ''0:0:5''' 
+0

的確,您可以從語法高亮中看到這一點。 – Ben