溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

.NET應(yīng)用程序SQL注入的示例分析

發(fā)布時間:2021-09-16 16:05:32 來源:億速云 閱讀:116 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“.NET應(yīng)用程序SQL注入的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“.NET應(yīng)用程序SQL注入的示例分析”這篇文章吧。

1.準備工具:SQL SERVER ,Visual Studio

2.數(shù)據(jù)庫腳本和.net代碼(c#)

3.SqlServer Profiler

SQL腳本代碼:

USE MASTER 
GO
--檢索SQLTMP數(shù)據(jù)庫是否存在
IF EXISTS(SELECT * FROM SYSDATABASES WHERE name = 'SQLTMP')
--刪除SQLTMP數(shù)據(jù)庫
DROP DATABASE SQLTMP
GO
--創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE SQLTMP
GO
--使用SQLTMP數(shù)據(jù)庫
USE SQLTMP
GO
-------------創(chuàng)建一張表用來驗證SQL注入漏洞----------------
--檢索表是否存在
IF EXISTS(SELECT * FROM SYSOBJECTS WHERE name = 'admin')
--刪除表
DROP TABLE admin
GO
--創(chuàng)建表
CREATE TABLE admin
(
id INT PRIMARY KEY IDENTITY(1,1),--設(shè)置主鍵
name VARCHAR(20) NOT NULL,--用戶名
pass VARCHAR(20) NOT NULL--密碼
)
-------------插入一條測試數(shù)據(jù)---------------------------
INSERT INTO admin VALUES('admin','admin')
--查詢插入數(shù)據(jù)
SELECT * FROM admin

下面是一段驗證用戶名密碼的C#代碼:

<font size="3" color="#ff00ff">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
namespace SQLTmp
{
class Program
{
//數(shù)據(jù)庫連接字符串
public static String strCon = "Data Source=.;Initial Catalog=SQLTMP;Integrated Security=True";
//創(chuàng)建數(shù)據(jù)庫連接對象
static SqlConnection SqlCon = new SqlConnection(strCon);
static void Main(string[] args)
{
Console.WriteLine("請輸入用戶名:");
String name = Console.ReadLine();
Console.WriteLine("請輸入密碼:");
String pass = Console.ReadLine();
try
{
Program p = new Program();
//打開數(shù)據(jù)庫連接
p.Open();
string sql = "SELECT COUNT(*) FROM admin WHERE name = '"+name+"'AND pass = '"+pass+"'";
SqlCommand sqlcom = new SqlCommand(sql, SqlCon);
int i = (int)sqlcom.ExecuteScalar();
if (i > 0)
{
Console.WriteLine("登錄成功!");
}
else
{
Console.WriteLine("登錄失敗!");
}
Console.ReadLine();
}
catch (Exception)
{
throw;
}
finally {
//關(guān)閉數(shù)據(jù)庫連接
pass.Clone();
}
}
//打開數(shù)據(jù)庫連接
public void Open()
{
//關(guān)閉狀態(tài)下打開數(shù)據(jù)庫連接
if (SqlCon.State == ConnectionState.Closed)
{
SqlCon.Open();
}
//中斷情況下打開數(shù)據(jù)庫連接
if (SqlCon.State == ConnectionState.Broken)
{
//關(guān)閉
SqlCon.Close();
SqlCon.Open();
}
}
//關(guān)閉數(shù)據(jù)庫連接
public void Close() {
if (SqlCon.State == ConnectionState.Open || SqlCon.State == ConnectionState.Broken)
{
SqlCon.Close();
}
}
}
}
</font>

我們來測試一下

輸入正確的賬號密碼:

admin admin

.NET應(yīng)用程序SQL注入的示例分析

登錄成功

輸入錯誤的賬號密碼:

test test

.NET應(yīng)用程序SQL注入的示例分析

登錄失敗

我們在用戶名輸入:' or 1=1--

密碼:123

.NET應(yīng)用程序SQL注入的示例分析

會發(fā)現(xiàn)也能登錄成功!

數(shù)據(jù)庫中沒有這個賬號密碼,還會登錄成功?

why?

0x03剖析

我們來剖析一下SQL語句的運行過程

利用我的SQL語句跟蹤工具(SQL Server Profiler)

.NET應(yīng)用程序SQL注入的示例分析

單擊鏈接

.NET應(yīng)用程序SQL注入的示例分析

運行

我們來看一下輸正確的賬號密碼SQL語句的樣子

.NET應(yīng)用程序SQL注入的示例分析

在我們的SQL Server中執(zhí)行看看,有符合條件的數(shù)據(jù)

.NET應(yīng)用程序SQL注入的示例分析

我們再來看看輸入錯誤的賬號密碼SQL語句的樣子

.NET應(yīng)用程序SQL注入的示例分析

在我們的SQL Server中執(zhí)行看看,沒有符合條件的數(shù)據(jù)

.NET應(yīng)用程序SQL注入的示例分析

我們再來看看最后一次的輸入的賬號密碼的SQL語句的樣子

.NET應(yīng)用程序SQL注入的示例分析

我們來看看圖片中的SQL語句我們的上面的SQL語句對比一下

<font size="3" color="#ff00ff">SELECT COUNT(*) FROM SQLTMP WHERE name = 'admin' AND pass = 'admin'
SELECT COUNT(*) FROM SQLTMP WHERE name = '' or 1=1 -- ' AND pass = '123'
</font>

我們會發(fā)現(xiàn)我們輸入的用戶名變成了空,后面多了or 1=1 --'這又是為什么,什么原因?qū)е碌????/p>

到離這里我們就應(yīng)該看看這一段代碼:

<font size="3" color="#ff00ff"> string sql = "SELECT COUNT(*) FROM admin WHERE name = '"+name+"'AND pass = '"+pass+"'";
</font>

我們可以看出SQL是中的name和pass是變量是用戶輸入的賬號和密碼

我們來看一下輸入的用戶名:' or 1=1 --

那么用戶如輸入'的時候就會自動把name = ''閉合

而 or 1=1 將where 條件永遠成立

--在SQL是注釋的意思會將后面的SQL語句注釋掉!!!

那么我們就可以這么認為SQL語句到最后是這個樣子的

<font size="3" color="#ff00ff">SELECT COUNT(*) FROM SQLTMP WHERE name = '' or 1=1</font>

0x04防御

有攻擊的方式是會有防御的方式

據(jù)我所知常用的有倆種方式:

1.通過SQLParameter

好處:預編譯SQL語句防止被轉(zhuǎn)意

用法:

<font size="3" color="#ff00ff">string sql = "SELECT COUNT(*) FROM admin WHERE name = [url=home.php?mod=space&uid=116087]@name[/url] AND pass = @pass "; 
//創(chuàng)建SParameter[]
SqlParameter[] para = {
new SqlParameter("@name",name),
new SqlParameter("@pass",pass)
};
SqlCommand sqlcom = new SqlCommand(sql, SqlCon);
//通過Parameters.addRange方法將para[]放進去
sqlcom.Parameters.AddRange(para);
int i = (int)sqlcom.ExecuteScalar();
</font>

@符號代表的參數(shù),我們把拼接的方式換成了參數(shù)的形式

.NET應(yīng)用程序SQL注入的示例分析

2.存儲過程

1.首先在數(shù)據(jù)庫中創(chuàng)建存儲過程

<font size="3" color="#ff00ff">CREATE PROC Login (@name VARCHAR(20) ,@pass VARCHAR(20))
AS
SELECT COUNT(*) FROM admin WHERE name =@name AND pass = @pass
GO
</font>

2. 調(diào)用存儲過程

<font size="3" color="#ff00ff">SqlParameter[] para = {
new SqlParameter("@name",name),
new SqlParameter("@pass",pass)
};
SqlCommand sqlcom = new SqlCommand();
sqlcom.Connection = SqlCon;
sqlcom.CommandText = "Login";
//指定執(zhí)行類型為存儲過程
sqlcom.CommandType = CommandType.StoredProcedure;
sqlcom.Parameters.AddRange(para);
int i = (int)sqlcom.ExecuteScalar();
</font>

.NET應(yīng)用程序SQL注入的示例分析

以上是“.NET應(yīng)用程序SQL注入的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

sql
AI