2017-01-09 15 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 *とsys.databasesからwaitfor delayを置き換えてください。 –

答えて

2

ダイナミック SQLとして扱われるから@v_stringを防ぐために、とにかくはありますか?

Iは、T-SQLコードは何EXECUTEまたはEXECUTE sp_executeSQLを持っていないので@v_stringが、ここで、動的SQLとして扱われることを期待していません。値は実行されませんが、SQLインジェクションに脆弱ではないWHERE句の値として扱われます。

質問に答えられない場合は、値が動的SQLとして扱われることを示す完全な例を投稿してください。

+0

そのように: '@ v_string = 'test' ''; waitfor delay '0:0:5' - 渡される値です。私が見る限り、2番目のセットが実行され、注入されたSQLが実行されます。 –

+0

@v_stringの値はクエリに渡されますが、 withinは実行されません。更新された質問のコードに、あなたが懸念している問題は表示されません。 –

2

あなたは自分のテストで混乱しています。行は:

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

test'で文字列@v_stringを作成し、その後waitfor delay '0:0:5'を実行しています。 実際のEmployeeクエリが実行されています。

あなたのクエリを実行するのであれば、あなたの追加の例で、あるとして:

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

...何が起こるだろうことは、コードのラインが、その後すぐにselect * from sys.databasesを実行し、test'する@v_stringを設定しますです。残りのコードが実行され、実際の選択が実行されます。だから、あなたEmployeeクエリの結果に続いて、select * from sys.databases結果が表示されますが、あなたは実際にそれを実現することなく、あなたの手順に声明select * from sys.databasesをハードコーディングされたという理由だけで:)

あなたは文字列をしたい場合@v_stringtest'; waitfor delay '0:0:5'に設定すると、got the string quotingが間違っています。

+0

確かに、それは構文ハイライトから見ることができます。 – Ben

関連する問題