當前位置:首頁 » 編程語言 » sql盲注攻擊畢業論文
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql盲注攻擊畢業論文

發布時間: 2023-01-06 09:51:34

① 如何防範sql注入攻擊

一、 SQL注入攻擊的簡單示例。
statement := "SELECT * FROM Users WHERE Value= " + a_variable + "
上面這條語句是很普通的一條SQL語句,他主要實現的功能就是讓用戶輸入一個員工編號然後查詢處這個員工的信息。但是若這條語句被不法攻擊者改裝過後,就可能成為破壞數據的黑手。如攻擊者在輸入變數的時候,輸入以下內容SA001』;drop table c_order--。那麼以上這條SQL語句在執行的時候就變為了SELECT * FROM Users WHERE Value= 『SA001』;drop table c_order--。
這條語句是什麼意思呢?『SA001』後面的分號表示一個查詢的結束和另一條語句的開始。c_order後面的雙連字元 指示當前行餘下的部分只是一個注釋,應該忽略。如果修改後的代碼語法正確,則伺服器將執行該代碼。系統在處理這條語句時,將首先執行查詢語句,查到用戶編號為SA001 的用戶信息。然後,數據將刪除表C_ORDER(如果沒有其他主鍵等相關約束,則刪除操作就會成功)。只要注入的SQL代碼語法正確,便無法採用編程方式來檢測篡改。因此,必須驗證所有用戶輸入,並仔細檢查在您所用的伺服器中執行構造 SQL命令的代碼。

二、 SQL注入攻擊原理。
可見SQL注入攻擊的危害性很大。在講解其防止辦法之前,資料庫管理員有必要先了解一下其攻擊的原理。這有利於管理員採取有針對性的防治措施。
SQL注入是目前比較常見的針對資料庫的一種攻擊方式。在這種攻擊方式中,攻擊者會將一些惡意代碼插入到字元串中。然後會通過各種手段將該字元串傳遞到SQLServer資料庫的實例中進行分析和執行。只要這個惡意代碼符合SQL語句的規則,則在代碼編譯與執行的時候,就不會被系統所發現。
SQL注入式攻擊的主要形式有兩種。一是直接將代碼插入到與SQL命令串聯在一起並使得其以執行的用戶輸入變數。上面筆者舉的例子就是採用了這種方法。由於其直接與SQL語句捆綁,故也被稱為直接注入式攻擊法。二是一種間接的攻擊方法,它將惡意代碼注入要在表中存儲或者作為原書據存儲的字元串。在存儲的字元串中會連接到一個動態的SQL命令中,以執行一些惡意的SQL代碼。
注入過程的工作方式是提前終止文本字元串,然後追加一個新的命令。如以直接注入式攻擊為例。就是在用戶輸入變數的時候,先用一個分號結束當前的語句。然後再插入一個惡意SQL語句即可。由於插入的命令可能在執行前追加其他字元串,因此攻擊者常常用注釋標記「—」來終止注入的字元串。執行時,系統會認為此後語句位注釋,故後續的文本將被忽略,不背編譯與執行。

三、 SQL注入式攻擊的防治。
既然SQL注入式攻擊的危害這么大,那麼該如何來防治呢?下面這些建議或許對資料庫管理員防治SQL注入式攻擊有一定的幫助。
1、 普通用戶與系統管理員用戶的許可權要有嚴格的區分。
如果一個普通用戶在使用查詢語句中嵌入另一個Drop Table語句,那麼是否允許執行呢?由於Drop語句關繫到資料庫的基本對象,故要操作這個語句用戶必須有相關的許可權。在許可權設計中,對於終端用戶,即應用軟體的使用者,沒有必要給他們資料庫對象的建立、刪除等許可權。那麼即使在他們使用SQL語句中帶有嵌入式的惡意代碼,由於其用戶許可權的限制,這些代碼也將無法被執行。故應用程序在設計的時候,最好把系統管理員的用戶與普通用戶區分開來。如此可以最大限度的減少注入式攻擊對資料庫帶來的危害。

2、 強迫使用參數化語句。
如果在編寫SQL語句的時候,用戶輸入的變數不是直接嵌入到SQL語句。而是通過參數來傳遞這個變數的話,那麼就可以有效的防治SQL注入式攻擊。也就是說,用戶的輸入絕對不能夠直接被嵌入到SQL語句中。與此相反,用戶的輸入的內容必須進行過濾,或者使用參數化的語句來傳遞用戶輸入的變數。參數化的語句使用參數而不是將用戶輸入變數嵌入到SQL語句中。採用這種措施,可以杜絕大部分的SQL注入式攻擊。不過可惜的是,現在支持參數化語句的資料庫引擎並不多。不過資料庫工程師在開發產品的時候要盡量採用參數化語句。

3、 加強對用戶輸入的驗證。
總體來說,防治SQL注入式攻擊可以採用兩種方法,一是加強對用戶輸入內容的檢查與驗證;二是強迫使用參數化語句來傳遞用戶輸入的內容。在SQLServer資料庫中,有比較多的用戶輸入內容驗證工具,可以幫助管理員來對付SQL注入式攻擊。測試字元串變數的內容,只接受所需的值。拒絕包含二進制數據、轉義序列和注釋字元的輸入內容。這有助於防止腳本注入,防止某些緩沖區溢出攻擊。測試用戶輸入內容的大小和數據類型,強制執行適當的限制與轉換。這即有助於防止有意造成的緩沖區溢出,對於防治注入式攻擊有比較明顯的效果。
如可以使用存儲過程來驗證用戶的輸入。利用存儲過程可以實現對用戶輸入變數的過濾,如拒絕一些特殊的符號。如以上那個惡意代碼中,只要存儲過程把那個分號過濾掉,那麼這個惡意代碼也就沒有用武之地了。在執行SQL語句之前,可以通過資料庫的存儲過程,來拒絕接納一些特殊的符號。在不影響資料庫應用的前提下,應該讓資料庫拒絕包含以下字元的輸入。如分號分隔符,它是SQL注入式攻擊的主要幫凶。如注釋分隔符。注釋只有在數據設計的時候用的到。一般用戶的查詢語句中沒有必要注釋的內容,故可以直接把他拒絕掉,通常情況下這么做不會發生意外損失。把以上這些特殊符號拒絕掉,那麼即使在SQL語句中嵌入了惡意代碼,他們也將毫無作為。
故始終通過測試類型、長度、格式和范圍來驗證用戶輸入,過濾用戶輸入的內容。這是防止SQL注入式攻擊的常見並且行之有效的措施。

4、 多多使用SQL Server資料庫自帶的安全參數。
為了減少注入式攻擊對於SQL Server資料庫的不良影響,在SQLServer資料庫專門設計了相對安全的SQL參數。在資料庫設計過程中,工程師要盡量採用這些參數來杜絕惡意的SQL注入式攻擊。
如在SQL Server資料庫中提供了Parameters集合。這個集合提供了類型檢查和長度驗證的功能。如果管理員採用了Parameters這個集合的話,則用戶輸入的內容將被視為字元值而不是可執行代碼。即使用戶輸入的內容中含有可執行代碼,則資料庫也會過濾掉。因為此時資料庫只把它當作普通的字元來處理。使用Parameters集合的另外一個優點是可以強制執行類型和長度檢查,范圍以外的值將觸發異常。如果用戶輸入的值不符合指定的類型與長度約束,就會發生異常,並報告給管理員。如上面這個案例中,如果員工編號定義的數據類型為字元串型,長度為10個字元。而用戶輸入的內容雖然也是字元類型的數據,但是其長度達到了20個字元。則此時就會引發異常,因為用戶輸入的內容長度超過了資料庫欄位長度的限制。

5、 多層環境如何防治SQL注入式攻擊?
在多層應用環境中,用戶輸入的所有數據都應該在驗證之後才能被允許進入到可信區域。未通過驗證過程的數據應被資料庫拒絕,並向上一層返回一個錯誤信息。實現多層驗證。對無目的的惡意用戶採取的預防措施,對堅定的攻擊者可能無效。更好的做法是在用戶界面和所有跨信任邊界的後續點上驗證輸入。如在客戶端應用程序中驗證數據可以防止簡單的腳本注入。但是,如果下一層認為其輸入已通過驗證,則任何可以繞過客戶端的惡意用戶就可以不受限制地訪問系統。故對於多層應用環境,在防止注入式攻擊的時候,需要各層一起努力,在客戶端與資料庫端都要採用相應的措施來防治SQL語句的注入式攻擊。

6、 必要的情況下使用專業的漏洞掃描工具來尋找可能被攻擊的點。
使用專業的漏洞掃描工具,可以幫助管理員來尋找可能被SQL注入式攻擊的點。不過漏洞掃描工具只能發現攻擊點,而不能夠主動起到防禦SQL注入攻擊的作用。當然這個工具也經常被攻擊者拿來使用。如攻擊者可以利用這個工具自動搜索攻擊目標並實施攻擊。為此在必要的情況下,企業應當投資於一些專業的漏洞掃描工具。一個完善的漏洞掃描程序不同於網路掃描程序,它專門查找資料庫中的SQL注入式漏洞。最新的漏洞掃描程序可以查找最新發現的漏洞。所以憑借專業的工具,可以幫助管理員發現SQL注入式漏洞,並提醒管理員採取積極的措施來預防SQL注入式攻擊。如果攻擊者能夠發現的SQL注入式漏洞資料庫管理員都發現了並採取了積極的措施堵住漏洞,那麼攻擊者也就無從下手了。

② 什麼是盲目的SQL 注入

SQL注入:利用現有應用程序,將(惡意)的SQL命令注入到後台資料庫引擎執行的能力,這是SQL注入的標准釋義。
隨著B/S模式被廣泛的應
用,用這種模式編寫應用程序的程序員也越來越多,但由於開發人員的水平和經驗參差不齊,相當一部分的開發人員在編寫代碼的時候,沒有對用戶的輸入數據或者
是頁面中所攜帶的信息(如Cookie)進行必要的合法性判斷,導致了攻擊者可以提交一段資料庫查詢代碼,根據程序返回的結果,獲得一些他想得到的數據。

SQL注入利用的是正常的HTTP服務埠,表面上看來和正常的web訪問沒有區別,隱蔽性極強,不易被發現。
SQL注入攻擊過程分為五個步驟:
第一步:判斷Web環境是否可以SQL注入。如果URL僅是對網頁的訪問,不存在SQL注入問題,如:http://www.../162414739931.shtml就是普通的網頁訪問。只有對資料庫進行動態查詢的業務才可能存在SQL注入,如:http://www...../webhp?id=39,其中?id=39表示資料庫查詢變數,這種語句會在資料庫中執行,因此可能會給資料庫帶來威脅。
第二步:尋找SQL注入點。完成上一步的片斷後,就要尋找可利用的注入漏洞,通過輸入一些特殊語句,可以根據瀏覽器返回信息,判斷資料庫類型,從而構建資料庫查詢語句找到注入點。

第三步:猜解用戶名和密碼。資料庫中存放的表名、欄位名都是有規律可言的。通過構建特殊資料庫語句在資料庫中依次查找表名、欄位名、用戶名和密碼的長度,以及內容。這個猜測過程可以通過網上大量注入工具快速實現,並藉助破解網站輕易破譯用戶密碼。

第四步:尋找WEB管理後台入口。通常WEB後台管理的界面不面向普通用戶

開放,要尋找到後台的登陸路徑,可以利用掃描工具快速搜索到可能的登陸地址,依次進行嘗試,就可以試出管理台的入口地址。

第五步:入侵和破壞。成功登陸後台管理後,接下來就可以任意進行破壞行為,如篡改網頁、上傳木馬、修改、泄漏用戶信息等,並進一步入侵資料庫伺服器。
SQL注入攻擊的特點:

變種極多,有經驗的攻擊者會手動調整攻擊參數,致使攻擊數據的變種是不可枚舉的,這導致傳統的特徵匹配檢測方法僅能識別相當少的攻擊,難以防範。

攻擊過程簡單,目前互聯網上流行眾多的SQL注入攻擊工具,攻擊者藉助這些工具可很快對目標WEB系統實施攻擊和破壞。

危害大,由於WEB編程語言自身的缺陷以及具有安全編程能力的開發人員少之又少,大多數WEB業務系統均具有被SQL注入攻擊的可能。而攻擊者一旦攻擊成功,可以對控制整個WEB業務系統,對數據做任意的修改,破壞力達到及至。

SQL注入的危害和現狀

SQL注入的主要危害包括:

未經授權狀況下操作資料庫中的數據

惡意篡改網頁內容

私自添加系統帳號或者是資料庫使用者帳號

網頁掛木馬

如何防止SQL參數:
1,檢查上傳的數據,並過濾
2. 禁止拼接SQL字元串
3.使用SQL參數化處理
4.載入防入侵等硬體設施

③ 試解釋 SQL 注入攻擊的原理,以及對資料庫可能產生的不利影響。

SQL注入就是攻擊者通過正常的WEB頁面,把自己SQL代碼傳入到應用程序中,從而通過執行非程序員預期的SQL代碼,達到竊取數據或破壞的目的。

當應用程序使用輸入內容來構造動態SQL語句以訪問資料庫時,會發生SQL注入攻擊。如果代碼使用存儲過程,而這些存儲過程作為包含未篩選的用戶輸入的字元串來傳遞,也會發生SQL注入。SQL注入可能導致攻擊者使用應用程序登陸在資料庫中執行命令。如果應用程序使用特權過高的帳戶連接到資料庫,這種問題會變得很嚴重。在某些表單中,用戶輸入的內容直接用來構造(或者影響)動態SQL命令,或者作為存儲過程的輸入參數,這些表單特別容易受到SQL注入的攻擊。而許多網站程序在編寫時,沒有對用戶輸入的合法性進行判斷或者程序中本身的變數處理不當,使應用程序存在安全隱患。這樣,用戶就可以提交一段資料庫查詢的代碼,根據程序返回的結果,獲得一些敏感的信息或者控制整個伺服器,於是SQL注入就發生了。

一般SQL注入

在Web 應用程序的登錄驗證程序中,一般有用戶名(username) 和密碼(password) 兩個參數,程序會通過用戶所提交輸入的用戶名和密碼來執行授權操作。我們有很多人喜歡將SQL語句拼接起來。例如:

Select * from users where username =』 txtusername.Text 』 and password =』 txtpassword.Text 』

其原理是通過查找users 表中的用戶名(username) 和密碼(password) 的結果來進行授權訪問, 在txtusername.Text為mysql,txtpassword.Text為mary,那麼SQL查詢語句就為:

Select * from users where username =』 mysql 』 and password =』 mary 』

如果分別給txtusername.Text 和txtpassword.Text賦值』 or 『1』 = 『1』 --和abc。那麼,SQL 腳本解釋器中的上述語句就會變為:

Select * from users where username =』』or 『1』 = 『1』 -- and password =』abc』

該語句中進行了兩個條件判斷,只要一個條件成立,就會執行成功。而'1'='1'在邏輯判斷上是恆成立的,後面的"--" 表示注釋,即後面所有的語句為注釋語句這樣我們就成功登錄。即SQL注入成功.

如果我們給txtusername.Text賦值為:』;drop table users--即:

Select * from users where username =』』;drop table users-- and password =』abc』

整個用戶表就沒有了,當然這里要猜出數據表名稱。想想是多麼可怕的事情。

好我想大家在這里已經大致明白了一般SQL注入了,試想下您的登錄程序會不會出現我上述的情況。

防範SQL注入

那麼現在大家都在思考怎麼防範SQL注入了這里給出一點個人的建議

1.限制錯誤信息的輸出

這個方法不能阻止SQL注入,但是會加大SQL注入的難度,不會讓注入者輕易得到一些信息,讓他們任意破壞資料庫。SQL Server有一些系統變數,如果我們沒有限制錯誤信息的輸出,那麼注入著可以直接從出錯信息獲取,例如(假定這里用的string即字元類型並可以發生SQL注入):http://www.xxx.com/showdetail.aspx?id=49 and user>0 這句語句很簡單,但卻包含了SQL Server特有注入方法的精髓,。首先看看它的含義:首先,前面的語句是正常的,重點在and user>0,我們知道,user是SQL Server的一個內置變數,它的值是當前連接的用戶名,類型為nvarchar。拿一個nvarchar的值跟int的數0比較,系統會先試圖將nvarchar的值轉成int型,當然,轉的過程中肯定會出錯,SQL Server的出錯提示是:將nvarchar值 」abc」 轉換數據類型為 int 的列時發生語法錯誤,呵呵,abc正是變數user的值,這樣,注入著就拿到了資料庫的用戶名。

眾所周知,SQL Server的用戶sa是個等同Adminstrators許可權的角色,拿到了sa許可權,幾乎肯定可以拿到主機的Administrator了。上面的方法可以很方便的測試出是否是用sa登錄,要注意的是:如果是sa登錄,提示是將」dbo」轉換成int的列發生錯誤,而不是」sa」。

當然注入者還可以輸入不同的信息來得到他們想要的信息 ,上面只是其中一個例子,所以我們要限制錯誤信息的輸出,從而保護我們的資料庫數據,這里我給出.NET限制錯誤信息的方法:

在Web.Config文件中設置

<customErrors mode="On" defaultRedirect="error.aspx">

</customErrors>

這樣當發生錯誤時候就不會講信息泄露給外人。

2.限制訪問資料庫帳號的許可權

對於資料庫的任何操作都是以某種特定身份和相應許可權來完成的,SQL語句執行前,在資料庫伺服器端都有一個用戶許可權驗證的過程,只有具備相應許可權的帳號才可能執行相應許可權內的SQL語句。因此,限制資料庫帳號許可權,實際上就阻斷了某些SQL語句執行的可能。不過,這種方法並不能根本解決SQL注入問題,因為連接資料庫的帳號幾乎總是比其他單個用戶帳號擁有更多的許可權。通過限制貼帳號許可權,可以防止刪除表的攻擊,但不能阻止攻擊者偷看別人的信息。

3.參數化使用命令

參數化命令是在SQL文本中使用佔位符的命令。佔位符表示需要動態替換的數據,它們通過Command對象Parameters集合來傳送。能導致攻擊的SQL代碼可以寫成:

Select * from employee where userID=@userID;

如果用戶輸入: 09105022』OR 『1』=』1,將得不到何記錄,因為沒有一個用戶ID與文本框中輸入的』 09105022』OR 『1』=』1』相等。參數化命令的語法隨提供程序的不同略有差異。對於SQL SERVER提供程序,參數化命令使用命名的佔位符(具有唯一的名字),而對於OLE DB提供程序,每個硬編碼的值被問號代替。使用OLE DB提供程序時,需要保證參數的順序和它們出現在SQL字元串中的位置一致。SQL SERVER提供程序沒有這樣的需求,因為它們用名字和佔位符匹配。

4.調用存儲過程

存儲過程是存儲在資料庫伺服器上的一系列SQL代碼,存儲過程與函數相似,有良好的邏輯封裝結構,可以接收和返回數據。使用存儲過程可以使代碼更易於維護,因為對存儲過程的更改不會導致應用程序的重新編譯,使用存儲過程還可以節省帶寬,提高應用程序性能。因為存儲過程是存儲在資料庫服務端的獨立的封裝體,調用存儲過程可以保證應用程序只執行存儲過程中的固定代碼,從而杜絕SQL語句注入的可能。結合上述所講的參數化命令,可以實現SQL代碼可以實現的任何功能,並進一步提高應用程序的安全等級。

5.限制輸入長度

如果在Web頁面上使用文本框收集用戶輸入的數據,使用文本框的MaxLength屬性來限制用戶輸入過長的字元也是一個很好的方法,因為用戶的輸入不夠長,也就減少了貼入大量腳本的可能性。程序員可以針對需要收集的數據類型作出一個相應的限制策略。

6.URL重寫技術

我們利用URL重寫技術過濾一些SQL注入字元,從而達到防禦SQL注入。因為許多SQL注入是從URL輸入發生的。

7.傳遞參數盡量不是字元

假設我們顯示一篇新聞的頁面,從URL傳遞參數中獲得newid我們可能會隨手寫下下面的代碼:

string newsid = Request.QueryString["newsid"];
string newssql = "select * from news where newsid=" + newsid;

如果傳遞過來的參數是數字字元就沒有問題。但是如果傳遞過來的newsid是「1 delete from table 」的話,那麼sql的值就變成了「select * from table where newsid=1 delete from news」。發生注入成功。但是這里改為

int newsid=int.Parse(Request.QueryString["newsid"].ToString());

string newssql = "select * from news where newsid=" + newsid.Tostring();

這里如果還是上面"1 delete from table "會發生錯誤,因為在轉換時候出現了錯誤

從上面的一個小例子,我們得出在傳遞參數時候盡量不要用字元,免得被注入。

最後是我想擴展下利用URL重寫技術來過濾一些SQL注入字元,首先這里有一篇關於URL重寫的文章,我的基本思想是可以利用它,屏蔽一些危險的SQL注入字元串,這些字元串我們可以人為的設定,畢竟我們還是根據特定的環境設定我們防禦措施。首先我們在MoleRewriter類中的Rewrite函數得到絕對的URL判斷其中是否有危險字元,如果有我們就將它鏈接到一個提示用戶您輸入危險的URL地址。如果不是我們繼續判斷是否觸發了其他的URL重寫的規則,觸發了就重寫。這樣就大致上能在URL上防禦危險字元。

代碼
<configSections>
<section name="RewriterConfig" type="URLRewriter.Config., URLRewriter" />
</configSections>
<RewriterConfig>
<Rules>
<RewriterRule>
<LookFor>~/d(\d+)\.aspx</LookFor>
<SendTo>~/Default_sql_error.aspx</SendTo>
</RewriterRule>
<RewriterRule>
<LookFor>~/d(\d+)\.aspx</LookFor>
<SendTo>~/Default2.aspx</SendTo>
</RewriterRule>
</Rules>
</RewriterConfig>
<httpMoles>
<add type="URLRewriter.MoleRewriter, URLRewriter" name="MoleRewriter" />
</httpMoles>

上面是要在web.config配置文件加上的內容,這里我加上了兩個重寫規則,第一個規則是專門針對滿足這個正則表達式的頁面URL查看是否有危險字元,有危險字元就會發送到Default_sql_error.aspx頁面,來示警。這里我假定會發生危險字元注入的頁面時以"d"字元開頭並加上數字的頁面(這里我們可以根據實際情況自己定義,看哪些頁面URL容易發生我們就制定這些頁面的正則表達式),第二個是一般URL重寫。因為這里我採用的是HTTP模塊執行URL重寫,所以加上<httpMoles></httpMoles>這一塊。

第二步就是要在重寫Rewrite函數了

代碼
protected override void Rewrite(string requestedPath, System.Web.HttpApplication app)
{
// 獲得配置規則
RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;

//獲得絕對的URL
Uri url = app.Request.Url;

// 判斷url 中是否含有SQL 注入攻擊敏感的字元或字元串,如果存在,sqlatFlag = 1 ;
string urlstr = url.AbsoluteUri;
int sqlatFlag = 0;

//這里我們根據實際情況隨便編寫,我這里這是隨便列舉了幾個
string words = "exec ,xp ,sp ,declare ,cmd ,Union ,--";

string[] split = words.Split(',');
foreach (string s in split)
{
if (urlstr.IndexOf(s.ToUpper()) > 0)
{
sqlatFlag = 1;
break;
}
}
if (sqlatFlag == 1)
{
// 創建regex
Regex re = new Regex(rules[0].SendTo, RegexOptions.IgnoreCase);
// 找到匹配的規則,進行必要的替換
string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.ToString());
// 重寫URL
RewriterUtils.RewriteUrl(app.Context, sendToUrl);
}
else
{
// 遍歷除rules[0 ]以外的其他URL 重寫規則
for (int i = 1; i < rules.Count; i++)
{
// 獲得要查找的模式,並且解析URL (轉換為相應的目錄)
string lookFor = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + "$";
// 創建regex
Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);
// 查看是否找到了匹配的規則
if (re.IsMatch(requestedPath))
{
// 找到了匹配的規則, 進行必要的替換
string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].SendTo));
// 重寫URL
RewriterUtils.RewriteUrl(app.Context, sendToUrl);
break;
// 退出For 循環
}
}
}
}

那麼下一步就是檢驗例子了

首先我們輸入http://localhost:4563/web/Default.aspx?id=1;--

這樣http://localhost:4563/web/Default.aspx?id=1;-- 沒有改變,就會顯示Default_sql_error.aspx里內容「您輸入了危險字元」。
再輸入http://localhost:4563/web/D11.aspx就會顯示 Default2.aspx內容,因為這里觸發了第二個重寫規則

④ 部分sql注入總結

本人ctf選手一名,在最近做練習時遇到了一些sql注入的題目,但是sql注入一直是我的弱項之一,所以寫一篇總結記錄一下最近學到的一些sql注入漏洞的利用。

在可以聯合查詢的題目中,一般會將資料庫查詢的數據回顯到首頁面中,這是聯合注入的前提。

適用於有回顯同時資料庫軟體版本是5.0以上的MYSQL資料庫,因為MYSQL會有一個系統資料庫information_schema, information_schema 用於存儲資料庫元數據(關於數據的數據),例如資料庫名、表名、列的數據類型、訪問許可權等

聯合注入的過程:

判斷注入點可以用and 1=1/and 1=2用於判斷注入點

當注入類型為數字型時返回頁面會不同,但都能正常執行。

sql注入通常為數字型注入和字元型注入:

1、數字型注入

數字型語句:

在這種情況下直接使用and 1=1/and 1=2是都可以正常執行的但是返回的界面是不一樣的

2、字元型注入

字元型語句:

字元型語句輸入我們的輸入會被一對單引號或這雙引號閉合起來。

所以如果我們同樣輸入and 1=1/and 1=2會發現回顯畫面是並無不同的。

在我們傳入and 1=1/and 1=2時語句變為

傳入的東西變成了字元串並不會被當做命令。

所以字元型的測試方法最簡單的就是加上單引號 ' ,出現報錯。

加上注釋符--後正常回顯界面。

這里還有的點就是sql語句的閉合也是有時候不同的,下面是一些常見的

這一步可以用到order by函數,order by 函數是對MySQL中查詢結果按照指定欄位名進行排序,除了指定字 段名還可以指定欄位的欄位進行排序,第一個查詢欄位為1,第二個為2,依次類推,所以可以利用order by就可以判斷列數。

以字元型注入為例:

在列數存在時會正常回顯

但是列數不存在時就會報錯

這步就說明了為什麼是聯合注入了,用到了UNION,UNION的作用是將兩個select查詢結果合並

但是程序在展示數據的時候通常只會取結果集的第一行數據,這就讓聯合注入有了利用的點。

當我們查詢的第一行是不存在的時候就會回顯第二行給我們。

講查詢的數據置為-1,那第一行的數據為空,第二行自然就變為了第一行

在這個基礎上進行注入

可以發現2,3都為可以利用的顯示點。

和前面一樣利用union select,加上group_concat()一次性顯示。

現在非常多的Web程序沒有正常的錯誤回顯,這樣就需要我們利用報錯注入的方式來進行SQL注入了

報錯注入的利用步驟和聯合注入一致,只是利用函數不同。

以updatexml為例。

UpdateXML(xml_target, xpath_expr, new_xml)

xml_target: 需要操作的xml片段

xpath_expr: 需要更新的xml路徑(Xpath格式)

new_xml: 更新後的內容

此函數用來更新選定XML片段的內容,將XML標記的給定片段的單個部分替換為 xml_target 新的XML片段 new_xml ,然後返回更改的XML。xml_target替換的部分 與xpath_expr 用戶提供的XPath表達式匹配。

這個函數當xpath路徑錯誤時就會報錯,而且會將路徑內容返回,這就能在報錯內容中看到我們想要的內容。

而且以~開頭的內容不是xml格式的語法,那就可以用concat函數拼接~使其報錯,當然只要是不符合格式的都可以使其報錯。

[極客大挑戰 2019]HardSQL

登錄界面嘗試注入,測試後發現是單引號字元型注入,且對union和空格進行了過濾,不能用到聯合注入,但是有錯誤信息回顯,說明可以使用報錯注入。

利用updatexml函數的報錯原理進行注入在路徑處利用concat函數拼接~和我們的注入語句

發現xpath錯誤並執行sql語句將錯誤返回。

在進行爆表這一步發現了等號也被過濾,但是可以用到like代替等號。

爆欄位

爆數據

這里就出現了問題flag是不完整的,因為updatexml能查詢字元串的最大長度為32,所以這里要用到left函數和right函數進行讀取

報錯注入有很多函數可以用不止updatexml一種,以下三種也是常用函數:

堆疊注入就是多條語句一同執行。

原理就是mysql_multi_query() 支持多條sql語句同時執行,用;分隔,成堆的執行sql語句。

比如

在許可權足夠的情況下甚至可以對資料庫進行增刪改查。但是堆疊注入的限制是很大的。但是與union聯合執行不同的是它可以同時執行無數條語句而且是任何sql語句。而union執行的語句是有限的。

[強網杯 2019]隨便注

判斷完注入類型後嘗試聯合注入,發現select被過濾,且正則不區分大小寫過濾。

那麼就用堆疊注入,使用show就可以不用select了。

接下去獲取表信息和欄位信息

那一串數字十分可疑大概率flag就在裡面,查看一下

這里的表名要加上反單引號,是資料庫的引用符。

發現flag,但是沒辦法直接讀取。再讀取words,發現裡面有個id欄位,猜測資料庫語句為

結合1'or 1=1#可以讀取全部數據可以利用改名的方法把修改1919810931114514為words,flag修改為id,就可以把flag讀取了。

最終payload:

盲注需要掌握的幾個函數

在網頁屏蔽了錯誤信息時就只能通過網頁返回True或者False判斷,本質上是一種暴力破解,這就是布爾盲注的利用點。

首先,判斷注入點和注入類型是一樣的。

但是盲注沒有判斷列數這一步和判斷顯示位這兩步,這是和可回顯注入的不同。

判斷完注入類型後就要判斷資料庫的長度,這里就用到了length函數。

以[WUSTCTF2020]顏值成績查詢為例

輸入參數後,發現url處有個get傳入的stunum

然後用到length函數測試是否有注入點。

發現頁面有明顯變化

將傳入變為

頁面回顯此學生不存在

那麼就可以得出資料庫名長度為3

測試發現過濾了空格

然後就是要查資料庫名了,這里有兩種方法

一、只用substr函數,直接對比

這種方法在寫腳本時可以用於直接遍歷。

二、加上ascii函數

這個payload在寫腳本時直接遍歷同樣可以,也可用於二分法查找,二分法速度更快。

接下來的步驟就和聯合注入一樣,只不過使用substr函數一個一個截取字元逐個判斷。但是這種盲注手工一個一個注十分麻煩所以要用到腳本。

直接遍歷腳本

二分法腳本

時間盲注用於代碼存在sql注入漏洞,然而頁面既不會回顯數據,也不會回顯錯誤信息

語句執行後也不提示真假,我們不能通過頁面的內容來判斷

所以有布爾盲注就必有時間盲注,但有時間盲注不一定有布爾盲注

時間盲注主要是利用sleep函數讓網頁的響應時間不同從而實現注入。

sql-lab-less8:

無論輸入什麼都只會回顯一個you are in...,這就是時間盲注的特點。

當正常輸入?id=1時時間為11毫秒

判斷為單引號字元型注入後,插入sleep語句

明顯發現響應時間為3053毫秒。

利用時間的不同就可以利用腳本跑出資料庫,後續步驟和布爾盲注一致。

爆庫

爆表

爆欄位

腳本

在進行SQL注入時,發現union,and,or被完全過濾掉了,就可以考慮使用異或注入

什麼是異或呢

異或是一種邏輯運算,運演算法則簡言之就是:兩個條件相同(同真或同假)即為假(0),兩個條件不同即為真(1),null與任何條件做異或運算都為null,如果從數學的角度理解就是,空集與任何集合的交集都為空

即 1^1=0,0^0=0,1^0=1

利用這個原理可以在union,and,or都被過濾的情況下實現注入

[極客大挑戰 2019]FinalSQL

給了五個選項但是都沒什麼用,在點擊後都會在url處出現?id。

而且union,and,or都被過濾

測試發現?id=1^1會報錯

但是?id=1^0會返回?id=1的頁面,這就是前面說的原理,當1^0時是等於1的所以返回?id=1的頁面。

根據原理寫出payload,進而寫出腳本。

爆庫

爆表

爆欄位

據此可以寫出基於異或的布爾盲注腳本

實驗推薦:課程:SQL注入初級(合天網安實驗室)

⑤ 求web2.0的SQL注入攻擊方法相關論文或資料,急等,24小時,送100分


Title : the Information Security Detection and Prevention of University Database

Abstract: With the increase of network security awareness, the single method of penetration test is unable to satisfy the need of remote penetration. The more effective way of remote penetration test uses comprehensively progressive attack techniques to intrude the internal network and get the target computer's authorization via horizontal privilege escalation so as to obtain the confidential information finally. As the preferred way of intruding an internal network, web scriting attack that mainly uses SQL injection attack has become one of the most important techniques in remote penetration test.SQL injection attack represents the common method that hackers use to attck databases. Like general access to a web page, It accesses the page via normal WWW ports in which case the firewall doesn't sound the alarm. Due to the flexibility of SQL injection, unexpected conditions often occure when using it. This article takes a PHP+MySQL website based on B/S architecture as a good example to deeply analyze the detection and prevention measures of SQL injection.

Key Words: DataBase information security SQL injection solutions

⑥ 如何防範SQL注入式攻擊

SQL注入攻擊的危害很大,而且防火牆很難對攻擊行為進行攔截,主要的SQL注入攻擊防範方法,具體有以下幾個方面。
1、分級管理
對用戶進行分級管理,嚴格控制用戶的許可權,對於普通用戶,禁止給予資料庫建立、刪除、修改等相關許可權,只有系統管理員才具有增、刪、改、查的許可權。
2、參數傳值
程序員在書寫SQL語言時,禁止將變數直接寫入到SQL語句,必須通過設置相應的參數來傳遞相關的變數。從而抑制SQL注入。數據輸入不能直接嵌入到查詢語句中。同時要過濾輸入的內容,過濾掉不安全的輸入數據。或者採用參數傳值的方式傳遞輸入變數,這樣可以最大程度防範SQL注入攻擊。
3、基礎過濾與二次過濾
SQL注入攻擊前,入侵者通過修改參數提交and等特殊字元,判斷是否存在漏洞,然後通過select、update等各種字元編寫SQL注入語句。因此防範SQL注入要對用戶輸入進行檢查,確保數據輸入的安全性,在具體檢查輸入或提交的變數時,對於單引號、雙引號、冒號等字元進行轉換或者過濾,從而有效防止SQL注入。
當然危險字元有很多,在獲取用戶輸入提交參數時,首先要進行基礎過濾,然後根據程序的功能及用戶輸入的可能性進行二次過濾,以確保系統的安全性。
4、使用安全參數
SQL資料庫為了有效抑制SQL注入攻擊的影響。在進行SQLServer資料庫設計時設置了專門的SQL安全參數。在程序編寫時應盡量使用安全參數來杜絕注入式攻擊,從而確保系統的安全性。
5、漏洞掃描
為了更有效地防範SQL注入攻擊,作為系統管理除了設置有效的防範措施,更應該及時發現系統存在SQL攻擊安全漏洞。系統管理員可以采購一些SQL漏洞掃描工具,通過專業的掃描工具,可以及時的掃描到系統存在的相應漏洞。
6、多層驗證
現在的網站系統功能越來越龐大復雜。為確保系統的安全,訪問者的數據輸入必須經過嚴格的驗證才能進入系統,驗證沒通過的輸入直接被拒絕訪問資料庫,並且向上層系統發出錯誤提示信息。同時在客戶端訪問程序中驗證訪問者的相關輸入信息,從而更有效的防止簡單的SQL注入。但是如果多層驗證中的下層如果驗證數據通過,那麼繞過客戶端的攻擊者就能夠隨意訪問系統。因此在進行多層驗證時,要每個層次相互配合,只有在客戶端和系統端都進行有效的驗證防護,才能更好地防範SQL注入攻擊。
7、資料庫信息加密
傳統的加解密方法大致分為三種:對稱加密、非對稱加密、不可逆加密。

⑦ sql盲注攻擊是什麼意思

SQL盲注是一種SQL注入漏洞,攻擊者可以操縱SQL語句,應用會針對真假條件返回不同的值。但是攻擊者無法檢索查詢結果。
由於SQL盲注漏洞非常耗時且需要向Web服務發送很多請求,因而要想利用該漏洞,就需要採用自動的技術。

SQL盲注是一種很常見的漏洞,但有時它非常細微,經驗不豐富的攻擊者可能會檢測不到。

⑧ SQL注入攻擊與防範

關於SQL注入攻擊與防範

隨著網路的普及,關系資料庫的廣泛應用,網路安全越來越重要。下面是我為大家搜索整理了關於SQL注入攻擊與防範,歡迎參考閱讀,希望對大家有所幫助。想了解更多相關信息請持續關注我們應屆畢業生培訓網!

一、 SQL注入攻擊

簡言之,SQL注入是應用程序開發人員未預期地把SQL代碼傳入到應用程序的過程。它由於應用程序的糟糕設計而成為可能,並且只有那些直接使用用戶提供的值構建SQL語句的應用程序才會受影響。

例如:用戶輸入客戶ID後,GridView顯示客戶的全部行記錄。在一個更加真實的案例中,用戶還要輸入密碼之類的驗證信息,或者根據前面的登錄頁面得到用戶ID,可能還會有一些用戶輸入關鍵信息的文本框,如訂單的日期范圍或產品名稱。問題在於命令是如何被執行的。在這個示例中,SQL語句通過字元串構造技術動態創建。文本框txtID的值被直接復制到字元串中。下面是代碼:

在這個示例中,攻擊者可以篡改SQL語句。通常,攻擊的第一個目標是得到錯誤信息。如果錯誤沒有被恰當處理,底層的信息就會暴露給攻擊者。這些信息可用於進一步攻擊。

例如,想像一下在文本一下在文本框中輸入下面的字元串會發生什麼?

ALFKI'OR '1'='1

再看看因此生成的完整SQL語句:

這條語句將返回所有的訂單記錄,即便那些訂單不是由ALFDI創建,因為對每一行而言而有信1=1總是true。這樣產生的後果是沒有顯示當前用戶特定信息,卻向攻擊者顯示了全部資料,如果屏幕上顯示的是敏感信息,如社會保險號,生日或信用卡資料,就會帶來嚴重的問題。事實上,這些簡單的SQL注入往往是困擾那些大型電子商務公司的麻煩。一般而言,攻擊點不在於文本框而在於查詢字元串(可被用於向資料庫傳送值,如列表頁向詳細信息頁面傳送唯一標識符)。

還可以進行更復雜的攻擊。例如,攻擊者可以使用兩個連接號(--)注釋掉SQL語句的剩餘部分。這樣的攻擊只限於SQL Server,不過對於其他類型的資料庫也有等效的辦法,如MySql使用(#)號,Oracle使用(;)號。另外攻擊者還可以執行含有任意SQL語句的批處理命令。對於SQL Server提供程序,攻擊者只需在新命令前加上分號(;)。攻擊者可以採用這樣的方式刪除其他表的內容,甚至調用SQL Server的系統存儲過程xp_cmdshell在命令執行任意的程序。

下面是攻擊者在文本框中輸入的,它的攻擊目標是刪除Customers表的全部行。

LUNCHUN』;DELETE*FROM Customers--

二、防範

如何預防SQL注入攻擊呢?需要記住幾點。首先,使用TextBox.MaxLength屬性防止用戶輸入過長的字元是一個好辦法。因為它們不夠長,也就減少了貼入大量腳本的可能性。其次,要使用ASP.NET驗證控制項鎖定錯誤的數據(如文本、空格、數值中的特殊字元)。另外,要限制錯誤信息給出的提示。捕獲到資料庫異常時,只顯示一些通用的信息(如「數據源錯誤」)而不是顯示Exception.Message屬性中的信息,它可能暴露了系統攻擊點。

更為重要的是,一定要小心去除特殊字元。比如,可以將單引號替換為兩個單引號,這樣它們就不會和SQL語句的分隔符混淆:

string ID=txtID.Text().Replace(「』」,」』』」);

當然,如果文本確實需要包含單引號,這樣做就引入了其他麻煩。另外,某些SQL注入攻擊還是可行的。替換單引號可以防止用戶提前結束一個字元串,然而,如果動態構建含有數值的SQL語句,SQL注入攻擊又有發揮的空間了。這個漏洞常被(這是很危險的)忽視。更好的解決辦法是使用參數化的命令或使用存儲過程執行轉義以防止SQL注入攻擊。

另一個好建議是限制用於訪問資料庫的賬號的許可權。這樣該賬號將沒有許可權訪問其他資料庫或執行擴展的存儲過程。不過這樣並不能解決SQL腳本注入的問題,因為用於連接資料庫的進程幾乎總是需要比任意單個用戶更大的許可權。通過限制許可權,可以預防刪除表的攻擊,但不能阻止攻擊者偷看別人的.信息

三、POST注入攻擊

精明的用戶可能會知道還有另外一個Web控制項攻擊的潛在途徑。雖然參數化的命令防止了SQL注入攻擊,但它們不能阻止攻擊者向回發到伺服器的數據添加惡意的值。如果不檢查這些值,就使得攻擊者可以提交本來不可能存在的控制項值。

例如,假設你有一個顯示當前用戶訂單的列表。狡詐的攻擊者可能保存該頁面的一個本地副本,修改HTML內容向列表添加更多的項目,然後選擇某個「假」的項目。如果攻擊成功,攻擊者就能夠看到其他用戶訂單,這顯然是一個問題。幸好,ASP.NET使用一個很少被提及的叫做「事件驗證」的特性來防止這種攻擊。事件驗證檢查回發到伺服器的數據並驗證其中值的合法性。例如,如果回發的數據表明用戶選擇了一個沒有意義的數據(因為它在控制項中並不存在),ASP.NET就產生一個錯誤並停止處理。可以在Page指令中設置EnableEventValidation特性為false來禁用事件驗證。創建使用客戶端腳本動態改變內容的頁面時,需要執行這一步。不過,此時在使用這些值之前要注意檢查潛在的POST注入攻擊。

;

⑨ 什麼是sql注入攻擊,請結合實例簡述其原理

作為一名學生,大家都經歷過考試,既然有考試,那將需要時間地點科目:
____月____日____時____分,第____教學樓____層____教室,考________,時長____分。
一個考試應該是這樣的:
6月23日9時30分,第13教學樓6層601教室,考高等數學,時長120分。
你是一個學生,你按照學校安排執行:到了6月23號9.30,然後拿著證件和筆去13教學樓6層601考高等數學。
但是如果空格里填寫了不正常的值,甚至包含了指令:
6月23日9時30分,第13教學樓6層601教室,考英語,時長90分鍾。6月24日9時30分,第13教學樓6層601教室高等數學,時長120分。
作為一名人類,可以輕易發現科目處添了一串指令,但是如果是機器呢?

⑩ sql注入攻擊與防禦是什麼

SQL注入攻擊:

惡意用戶在提交查詢請求的過程中將SQL語句插入到請求內容中,同時程序本身對用戶輸入內容過分信任而未對惡意用戶插入的SQL語句進行過濾,導致SQL語句直接被服務端執行。

SQL注入攻擊分類:

①注入點的不同分類:數字類型的注入、字元串類型的注入。

②提交方式的不同分類:GET注入、POST注入、COOKIE注入、HTTP注入。

③獲取信息方式的不同分類:基於布爾的盲注、基於時間的盲注、基於報錯的盲注。

SQL注入攻擊防禦方法:

①定製黑名單:將常用的SQL注入字元寫入到黑名單中,然後通過程序對用戶提交的POST、GET請求以及請求中的各個欄位都進行過濾檢查,篩選威脅字元。

②限制查詢長度:由於SQL注入過程中需要構造較長的SQL語句,因此,一些特定的程序可以使用限制用戶提交的請求內容的長度來達到防禦SQL注入的目的,但這種效果不太好。

③限制查詢類型:限制用戶請求內容中每個欄位的類型,並在用戶提交請求的時候進行檢查,凡不符合該類型的提交方式就認為是非法請求。

④白名單法:該方法只對部分程序有效,對一些請求內容相對固定的程序,可以制定請求內容的白名單,比如:某程序接受的請求只有數字,且數字為1-100,這樣可以檢查程序接受的請求內容是否匹配,如果不匹配,則認為是非法請求。

⑤設置資料庫許可權:根據程序要求為特定的表設置特定的許可權,如:某段程序對某表只需具備select許可權即可,這樣即使程序存在問題,惡意用戶也無法對表進行update或insert等寫入操作。

⑥限制目錄許可權:Web目錄應至少遵循可寫目錄不可執行,可執行目錄不可寫的原則;在此基礎上,對各目錄進行必要的許可權細化。