2013-02-05 63 views
0

我正在學習SQL注入並希望嘗試一種。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--

「鮑比「是一個無效的用戶名。

現在,我認爲應用程序會用假用戶名登錄,因爲1 = 1總是爲true,而其餘的SQL語句被註釋掉了。

但是,它顯示「Not logged」我在這裏丟失了什麼?

謝謝

+0

參數化查詢 - 就像您在此處構建的那樣 - 對其值進行編碼以防止SQL注入。如果您對編寫可注入查詢非常認真,則必須使用StringBuilder或串聯將值直接寫入查詢中。 – GalacticCowboy

+0

如何用存儲過程做到這一點?我一直在閱讀,存儲過程不一定是從sql注入安全的,除非你使用參數化查詢。但是,我如何在代碼中使用它?我無法找到任何地方如何使用沒有參數的存儲過程。我谷歌「存儲過程SQL注入」,但我發現所有教程解釋了創建存儲過程的錯誤方式,但不是如何在asp.net代碼中使用。 – coffeeak

+0

我用sql語句做了它,但我不知道如何用存儲過程來做到這一點。 – coffeeak

回答

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

bobby'或1 = 1- 是他正在輸入的用戶名。最後的' - '表示之後的所有內容都成爲註釋,因此理論上SQL語句變爲: 從UserName ='bobby'或1 = 1 的User中選擇UserName,UserPwd,它將返回所有用戶名和密碼。 –

+0

不,AND與其他行不同,至少這是它的外觀。 – digscoop

+0

我將標記digscoop的帖子作爲解決問題的答案以解決問題。謝謝! – coffeeak