Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net SQL注入存储过程_Asp.net_Sql Server_Tsql_Stored Procedures_Sql Injection - Fatal编程技术网

Asp.net SQL注入存储过程

Asp.net SQL注入存储过程,asp.net,sql-server,tsql,stored-procedures,sql-injection,Asp.net,Sql Server,Tsql,Stored Procedures,Sql Injection,我正在学习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 U

我正在学习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'或1=1-

bobby是一个无效的用户名

现在,我认为应用程序将使用假用户名登录,因为1=1始终为真,SQL语句的其余部分将被注释掉

但是,它没有显示我在这里遗漏了什么


谢谢

您是否只输入bobby'或1=1-'作为用户名?它仍将尝试匹配密码,因为它位于单独的行上。如果你把它和一个有效的密码结合起来,或者输入bobby'或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
第二种情况等于:

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

一个参数化查询——正如您在这里构造的那样——对其值进行编码以防止SQL注入。如果您对编写可注入查询很认真,那么必须使用StringBuilder或串联将值直接写入查询中。如何使用存储过程实现这一点?我一直在读到存储过程不一定能安全地避免sql注入,除非您使用参数化查询。但是我如何在代码中使用它呢?我在任何地方都找不到如何使用没有参数的存储过程。我使用google存储过程sql注入,但我找到的教程都解释了创建存储过程的错误方法,但没有解释如何在asp.net代码中使用。我使用sql语句创建了存储过程,但不知道如何使用存储过程。基本上是一样的-您的过程需要构造并执行sql,而无需检查其安全性。@GalacticCowboy Parameterized查询不编码值!如果你是这么想的,那你就没有抓住重点。参数化查询将数据值与查询代码分离。bobby'或1=1-是他输入的用户名。结尾处的“-”意味着之后的所有内容都将成为注释,因此理论上SQL语句将变成:从UserName='bobby'或1=1的用户中选择UserName,UserPwd,这将返回所有用户名和密码。否,和位于不同的行上,至少它看起来是这样的。我将标记digscoop的帖子作为结束话题的答案,因为问题已经解决了。谢谢大家!!它不会在另一排。@sql变量中没有回车符。它将返回。换行符位于红色字符之间,因此它位于字符串中。