2013-02-05 2 views
0

SQL 인젝션에 대해 배우고 싶습니다.SQL 인젝션 저장 프로 시저

웹 응용 프로그램을 만들고 내 데이터베이스에 대한 일부 정보에 액세스하는 저장 프로 시저를 만들었습니다. 여기

내 저장 프로 시저와의 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# 코드의 코드입니다 : I 입력, 사용자 이름 텍스트 상자에서

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

"바비 "잘못된 사용자 이름입니다.

이제 1 = 1은 항상 true이고 나머지 SQL 문은 주석 처리되어 있기 때문에 응용 프로그램이 가짜 사용자 이름으로 로그인한다고 생각했습니다.

그러나 "기록되지 않음"이 표시됩니다. 여기에 무엇이 누락 되었습니까?

감사합니다.

+0

여기에서 작성한 것처럼 매개 변수화 된 쿼리는 SQL 삽입을 방지하기 위해 값을 인코딩합니다. 주 사용 가능 쿼리를 작성하는 것이 중요하다면 StringBuilder 또는 연결을 사용하여 쿼리에 직접 값을 써야합니다. – GalacticCowboy

+0

저장 프로 시저를 사용하여이를 수행하는 방법? 필자는 매개 변수화 된 쿼리를 사용하지 않는 한 저장 프로 시저가 반드시 SQL 인젝션으로부터 안전하지는 않다고 읽었습니다. 하지만 코드에서 어떻게 사용합니까? 어디서나 매개 변수없이 저장 프로 시저를 사용하는 방법을 찾을 수 없습니다. 나는 "저장 프로 시저 SQL 주입",하지만 자습서는 모두 저장 프로 시저를 만드는 잘못된 방법을 설명하지만 ASP 코드에서 사용하는 방법을 찾을 수 없습니다. – coffeeak

+0

나는 SQL 문과 함께했는데 스토어드 프로 시저로 어떻게해야하는지 모른다. – coffeeak

답변

2

사용자 이름으로 바비 'OR 1 = 1 -'만 입력합니까? 그것은 별도의 줄에 있기 때문에 여전히 비밀 번호와 일치하려고합니다. 유효한 암호와 결합하거나 바비 '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 
+0

바비 또는 1 = 1-- 은 그가 입력하는 사용자 이름입니다. 결국 '-'는 그 이후의 모든 내용이 주석이되므로 이론적으로 SQL 문은 다음과 같이됩니다. UserName, 'UserName ='bobby '이거나 1 = 1 인 User에서 UserPwd를 선택하면 모든 사용자 이름과 암호가 반환됩니다. . –

+0

아니요, AND는 다른 행에 있습니다. 적어도 그것이 보이는 방식입니다. – digscoop

+0

문제점이 수정됨에 따라 주제를 닫기위한 답변으로 digscoop의 게시물을 표시합니다. 고마워요 !! – coffeeak