標籤:style blog http color io strong for 資料
以前學習滲透時,雖然也玩過萬能密碼SQL注入漏洞登陸網站後台,但僅僅會用,並不理解其原理。
今天學習c#資料庫這一塊,正好學到了這方面的知識,才明白原來是怎麼回事。
眾所周知的萬能密碼SQL注入漏洞,大家相信很熟悉了。
不懂得簡單瞭解下,懂的大牛直接飄過即可。
*****************************************************************************
當我們用禦劍之類的掃描器掃描到某些有這個萬能密碼SQL注入的漏洞網站後台後,
開啟網頁,輸入下列內容,無需知道帳號密碼也可以登入後台。
http://www.*******.com/admin/admin_login.asp
帳號:djlfjdslajdfj(隨意輸入)密碼:1‘or’1’=‘1
那麼為什麼呢?
其實原理很簡單:
我們先看一條普通的資料庫查詢語句:
1.普通的直接在資料庫裡進行查詢語句:
select * from T_users where username=‘root‘ and password=‘root‘;
2.在網站開發中經常這樣做,T_users是表名,username是資料庫中欄位名,name和pwd是變數。
" select * form T_users username=‘ "+ name +" ‘ "+" and password=‘ "+ pwd +" ‘ ";
如果變數name賦值為root,pwd變數賦值為root的話,這根本不會有什麼問題,和上面一模一樣。
即等價於"select from T_users username=root and password=root "
3.但是如果變數name賦值:隨意輸入,而pwd被賦值 1 or 1=1 ,
那麼整個語句就變成了這個樣子:
"select from T_users username=adsfafsf and password=1 or 1=1 "
可以看出,此時整個查詢語句傳回值始終為true.
類比測試資料庫如下:
類比萬能密碼SQL注入漏洞源碼如下:
using System;using System.Data.SqlClient;namespace 第一個資料庫程式{ class Program { static void Main(string[] args) { //解決資料庫添加不進去資料,兩個mdf問題衝突問題代碼,即. /***************************************************/ string dataDir = AppDomain.CurrentDomain.BaseDirectory; if (dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release\")) { dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName; AppDomain.CurrentDomain.SetData("DataDirectory", dataDir); } /************************************************/ Console.WriteLine("請輸入使用者名稱:"); string user = Console.ReadLine(); Console.WriteLine("請輸入密碼:"); string pwd = Console.ReadLine(); //與資料庫建立串連 using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True")) { conn.Open();//開啟串連 //建立sql語句命令 using (SqlCommand cmd = conn.CreateCommand()) { //SQL語句查詢命令 cmd.CommandText = " select * from [T_users] where username=‘"+ user + "‘" + "and password=‘" + pwd + "‘" ; int i = Convert.ToInt32(cmd.ExecuteScalar());//返回第一行第一列的值 if (i > 0) { Console.WriteLine("登陸成功!"); } else { Console.WriteLine("登陸失敗!"); } } } Console.ReadKey(); } }}
程式運行:
普通輸入,輸錯密碼無法登陸:
輸入正確密碼,登陸成功:
輸入萬能密碼,登陸成功!
那麼該如何解決這問題呢?
解決源碼如下:
using System;using System.Data.SqlClient;namespace 第一個資料庫程式{ class Program { static void Main(string[] args) { //解決資料庫添加不進去資料,兩個mdf問題衝突問題代碼,即. /***************************************************/ string dataDir = AppDomain.CurrentDomain.BaseDirectory; if (dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release\")) { dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName; AppDomain.CurrentDomain.SetData("DataDirectory", dataDir); } /************************************************/ Console.WriteLine("請輸入使用者名稱:"); string user = Console.ReadLine(); Console.WriteLine("請輸入密碼:"); string pwd = Console.ReadLine(); //與資料庫建立串連 using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True")) { conn.Open();//開啟串連 //建立SQL命令語句 using (SqlCommand cmd = conn.CreateCommand()) { //SQL查詢語句 cmd.CommandText = "select * from T_users where [email protected] and [email protected]"; cmd.Parameters.Add(new SqlParameter("NAME", user));//NAME 和PW是參數,名字自己隨意取,但必須和上面的一致。 cmd.Parameters.Add(new SqlParameter("PW", pwd)); int i = Convert.ToInt32(cmd.ExecuteScalar());//函數返回第一行第一列的值 if (i > 0) { Console.WriteLine("登陸成功!"); } else { Console.WriteLine("登陸失敗!"); } } } Console.ReadKey(); } }}
普通輸入,輸錯密碼無法登陸:
輸入正確密碼,登陸成功:
萬能密碼登陸失敗!