從c#角度看萬能密碼SQL注入漏洞

來源:互聯網
上載者:User

標籤: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();        }    }} 

普通輸入,輸錯密碼無法登陸:

輸入正確密碼,登陸成功:

萬能密碼登陸失敗!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.