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


    以前學習滲透時,雖然也玩過萬能密碼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 where username='  "+ name +"   "+" and password=' "+ pwd +" ' ";

如果變量name賦值為root,pwd變量賦值為root的話,這根本不會有什么問題,和上面一模一樣。

即等價於"select * from T_users where username= 'root' and password= 'root' "

 

3.但是如果變量name賦值:隨意輸入,而pwd被賦值 1 or 1=1 ,

那么整個語句就變成了這個樣子:

"select from T_users where 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 username=@NAME and password=@PW";

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

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

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

萬能密碼登陸失敗!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM