0

SQL インジェクションについて学んでいて、試してみたいと思っていました。

Web アプリを作成し、データベースの情報にアクセスするためのストアド プロシージャを作成しました。

これが私のストアドプロシージャとasp .netアプリのコードです

Create Procedure spTest
(
    @UserName varchar(20),
    @UserPwd varchar(max)
)
AS
Begin
Declare @sql varchar(max)
set @sql = 'select UserName,UserPwd from Users where UserName='''+ @UserName+ ''' 
                                                And UserPwd = '''+ @UserPwd + ''' '
Exec(@sql)
End

C# コード:

string connString = System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
using (SqlConnection con = new SqlConnection(connString))
{
   SqlCommand cmd = new SqlCommand("spTest",con);
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.AddWithValue("@UserName",txtUserName.Text);
   cmd.Parameters.AddWithValue("@UserPwd", txtPassword.Text);
   con.Open();
   SqlDataReader dr = cmd.ExecuteReader();
   dr.Read();
   if (dr.HasRows)
   {
       labelLogin.Text = "Logged in";
   }
   else 
   { 
      labelLogin.Text = "Not logged in"; 
   }

ユーザー名のテキストボックスに、入力しますbobby' or 1=1--

「bobby」は無効なユーザー名です。

1=1 は常に true であり、残りの SQL ステートメントはコメントアウトされているため、アプリは偽のユーザー名でログインすると思いました。

しかし、「ログに記録されていません」と表示されます。

ありがとう

4

1 に答える 1

2

ユーザー名として bobby' OR 1=1 --' のみを入力しますか? パスワードは別の行にあるため、引き続きパスワードの照合を試みます。有効なパスワードと組み合わせるか、bobby' OR 1=1 --' をパスワードとして入力すると機能するはずです。

最初のケース:

select UserName,UserPwd from Users 
where UserName='bobby' OR 1=1 --'
And UserPwd = 'xyz'

2 番目のケース:

    select UserName,UserPwd from Users 
    where 'UserName'='bobby' OR 1=1 --'
    And 'UserPwd' = 'bobby' OR 1=1 --'

最初のケースは次のようになります:

select UserName,UserPwd from Users 
where 
    UserName='bobby' OR 
    (1=1 And UserPwd = 'xyz')

2 番目のケースは次のようになります。

select UserName,UserPwd from Users 
where 'UserName'='bobby' OR
    (1=1 And 'UserPwd' = 'bobby') OR 
    1=1
于 2013-02-05T11:54:43.917 に答える