web-dev-qa-db-ja.com

SQLコードを悪用する方法を見つけようとしています

ストアドプロシージャを悪用してセキュリティの問題をテストする方法を見つけようとしています。特にSQLの切り捨てベースのインジェクションをテストしていますが、これまでのところ成功していません。これは必ずしもコードがSQLインジェクションの影響を受けないためではないと思いますが、テストケースが完全ではなかったためか、このコードは悪用可能ですか?例?

USE [MyDB]
GO
SET ANSI_NULLS ON

GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[sp_mySP]       
    @Myfirst nvarchar(10),
      @Mysecond nvarchar(400)

AS
BEGIN
DECLARE @SQLString nvarchar(MAX);
DECLARE @ParmDefinition nvarchar(MAX);
      SET NOCOUNT ON;      
      SET @SQLString =  N'insert into MyTable (Myfirst, Mysecond) values (@first,@second)';
      SET @ParmDefinition = N'@first nvarchar(10),@second nvarchar(400)';

      exec sp_executesql
            @SQLString,@ParmDefinition,
            @first = @Myfirst,
            @second = @Mysecond;
END

ちなみに、これはデータベースにアクセスする.NETコードですが、呼び出し元の関数についての仮定なしに、ストアドプロシージャ自体を安全にする必要があります。

           cmd = new SqlCommand("sp_mySP", Con); //The SQL Command

        cmd.CommandType = CommandType.StoredProcedure;

        //Parameters
        SqlParameter first = new SqlParameter("@Myfirst", SqlDbType.NVarChar, 10);
        SqlParameter second= new SqlParameter("@Mysecond", SqlDbType.NVarChar, 400);
        first.Value = "value-here";// <-- Definitely not the test cases I used
        second.Value = "value-here";

        cmd.Parameters.Add(first);
        cmd.Parameters.Add(second);        

        Con.Open();
        cmd.ExecuteScalar();
3
Orca

ええ、あなたが持っているものは安全です。 MyTableのデータもどのような方法でも「実行」されていないと仮定します。

MyTableからMyFirstまたはMySecond列を選択し、上記で概説したパラメーター構文を使用せずにそれをEXECに渡す場合、それは悪いことです。基本的に、ユーザーが入力した文字列を最初のパラメーターとしてEXECまたはsp_executesqlに渡さないでください。

2
CodeNaked

切り捨てSQLインジェクション攻撃は、動的/連結クエリ構造にのみ適用されませんか?

6
TobyS