国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

深入淺析.NET應用程序SQL注入

2024-07-10 12:54:46
字體:
來源:轉載
供稿:網友

SQL腳本代碼,相信很多程序員都不陌生,它能幫助我們驗證到我們想要的效果,本文是錯新技術頻道小編帶給大家的深入淺析.NET應用程序SQL注入,一起來了解吧!

SQL腳本代碼:

USE MASTER GO--檢索SQLTMP數據庫是否存在IF EXISTS(SELECT * FROM SYSDATABASES WHERE name = 'SQLTMP')--刪除SQLTMP數據庫DROP DATABASE SQLTMPGO--創建數據庫CREATE DATABASE SQLTMPGO--使用SQLTMP數據庫USE SQLTMPGO-------------創建一張表用來驗證SQL注入漏洞------------------檢索表是否存在IF EXISTS(SELECT * FROM SYSOBJECTS WHERE name = 'admin')--刪除表DROP TABLE adminGO--創建表CREATE TABLE admin(id INT PRIMARY KEY IDENTITY(1,1),--設置主鍵name VARCHAR(20) NOT NULL,--用戶名pass VARCHAR(20) NOT NULL--密碼)-------------插入一條測試數據---------------------------INSERT INTO admin VALUES('admin','admin')--查詢插入數據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{//數據庫連接字符串public static String strCon = "Data Source=.;Initial Catalog=SQLTMP;Integrated Security=True";//創建數據庫連接對象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();//打開數據庫連接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 {//關閉數據庫連接pass.Clone();}}//打開數據庫連接public void Open(){//關閉狀態下打開數據庫連接if (SqlCon.State == ConnectionState.Closed){SqlCon.Open();}//中斷情況下打開數據庫連接if (SqlCon.State == ConnectionState.Broken){//關閉SqlCon.Close();SqlCon.Open();}}//關閉數據庫連接public void Close() {if (SqlCon.State == ConnectionState.Open || SqlCon.State == ConnectionState.Broken){SqlCon.Close();}}}}</font>

我們來測試一下

輸入正確的賬號密碼:

admin admin

登錄成功

輸入錯誤的賬號密碼:

test test

登錄失敗

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

密碼:123

會發現也能登錄成功!

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

why?

0x03剖析

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

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

單擊鏈接

運行

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

在我們的SQL Server中執行看看,有符合條件的數據

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

在我們的SQL Server中執行看看,沒有符合條件的數據

我們再來看看最后一次的輸入的賬號密碼的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>

我們會發現我們輸入的用戶名變成了空,后面多了or 1=1 --'這又是為什么,什么原因導致的???

到離這里我們就應該看看這一段代碼:

<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防御

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

據我所知常用的有倆種方式:

1.通過SQLParameter

好處:預編譯SQL語句防止被轉意

用法:

<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 "; //創建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>

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

2.存儲過程

1.首先在數據庫中創建存儲過程

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

2. 調用存儲過程

<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";//指定執行類型為存儲過程sqlcom.CommandType = CommandType.StoredProcedure;sqlcom.Parameters.AddRange(para);int i = (int)sqlcom.ExecuteScalar();</font>

好了,關于錯新技術頻道給大家介紹的深入淺析.NET應用程序SQL注入就給大家介紹到這里,希望對大家有所幫助,在此也非常感謝大家對js.VeVb.com的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 米林县| 赤城县| 繁峙县| 文登市| 施秉县| 若羌县| 双桥区| 隆林| 措勤县| 锡林浩特市| 茌平县| 旬邑县| 昌都县| 喀喇| 潼关县| 张家界市| 湟中县| 永平县| 三亚市| 桦南县| 娄烦县| 天镇县| 珠海市| 东乡族自治县| 富平县| 桦甸市| 禹州市| 祁连县| 苗栗市| 旌德县| 柞水县| 阳春市| 汉源县| 洞口县| 正安县| 商丘市| 铜梁县| 南郑县| 平罗县| 衡山县| 凤城市|