什么是简单的分析SQL注入漏洞
如今非常多人在入侵的過程中基本都是通過SQL注入來完畢的,可是有多少人知道為什么會有這種注入漏洞呢?有的會隨口說著對于字符的過濾不嚴(yán)造成的。
可是事實是這樣嗎?我們學(xué)這些。不僅要知其然。更要知其所以然!理論聯(lián)系實際,才干對我們技術(shù)的提高有所幫助。
步驟/方法
1、SQL注入。因為程序在實際使用中,為了管理龐大的數(shù)據(jù)信息,就會使用到數(shù)據(jù)庫。數(shù)據(jù)庫能夠方便程序?qū)θ繑?shù)據(jù)信息進行統(tǒng)一的存儲和分類組織。便于查詢更新。用戶在使用程序時,程序能夠自己主動通過對數(shù)據(jù)庫的查詢,將所獲得的信息依照一定格式反饋給用戶,同一時候用戶也是通過交互式的對話框提交給程序數(shù)據(jù)。從而使程序依照用戶想要的信息進行查詢。反饋給用戶想要的信息。
對于程序這樣的數(shù)據(jù)庫操作。先來看一段代碼:
strKeyword = Request ["keyword"];
sqlQuery = "SELECT * FROM Aritcles WHERE Keywords LIKE '%" +strKeyword + "%'";
這段代碼的主要目的是依照用戶提交的keywordKeyword。對軟件連接數(shù)據(jù)庫中的文件進行搜索,找出全部包括用戶keyword的文章來。如果此時。我們提交給軟件“hack”這個數(shù)據(jù),這時,“hack”這個keyword就會被傳遞給Keyword關(guān)鍵變量。接下來看看代碼的運行情況。keyword獲得數(shù)據(jù)“hack”后。被賦值給strKeyword變量。然后strKeyword變量被放入查詢語句。此時的查詢語句表現(xiàn)為:"SELECT * FROM Aritcles WHERE Keywords LIKE '%hack%'",這個查詢語句的意思就是從數(shù)據(jù)庫Aritcles表中查詢出全部包括“hack”這個keyword的文章。注意“hack”這個單詞是我們提交給程序的,因此能夠?qū)ζ淙我飧膭拥摹S谑恰D軌蜻@樣改動,把它變?yōu)椤癶ack'; DROP TABLE Aritcles; --”。
如今看看程序會如何處理這個外部keyword數(shù)據(jù)。
首先。查詢語句變成了:“SELECT * FROM Aritcles WHERE Keywords LIKE '%hack%'; DROP TABLE Aritcles; --”。我們知道DROP TABLE語句是在數(shù)據(jù)庫操作中刪除一個指定的表的意思。如今那個查詢語句的意思就變了。以中間的分號為標(biāo)志。分成兩個部分。首先還是正常的查出全部包括hackkeyword的文章。可是接下來……
因為程序使用的數(shù)據(jù)庫是微軟的SQL SERVER,該數(shù)據(jù)庫支持多命令語句運行。這些數(shù)據(jù)庫操作的命令語句都是由分號分隔開。然后依次運行的。
這里的“DROP TABLE Aritcles; --”是一個全然合法的命令語句,“--”符號是SQL SERVER數(shù)據(jù)庫特有凝視標(biāo)識,數(shù)據(jù)庫不運行不論什么命令。這樣,當(dāng)這段查詢語句運行時,就會去運行一個刪除Aritcles表的數(shù)據(jù)庫命令。
像這樣,通過控制傳遞給程序數(shù)據(jù)庫操作語句的關(guān)鍵變量來獲得惡意控制程序數(shù)據(jù)庫,從而獲取實用信息或者制造惡意破壞的,甚至是控制用戶計算機系統(tǒng)的漏洞,就稱之為“SQL注入漏洞”。
SQL注入漏洞全然是利用了將包括了某種目的的SQL語句,通過關(guān)鍵變量插入到程序中正常的數(shù)據(jù)庫操作語句里。
程序一旦發(fā)生注入漏洞,就會引發(fā)一系列安全隱患。
SQL注入漏洞是不分語言的,不管用什么語言開發(fā)的程序,僅僅要涉及對數(shù)據(jù)庫的操作。都可能存在SQL注入漏洞。
盡管有時會由于編寫語言的要求。或者程序設(shè)置環(huán)境的不同。導(dǎo)致SQL注入漏洞非常難被經(jīng)常使用的方法利用,可是總能夠找到突破的方法。
2、以下以站點程序為例。看一看SQL注入漏洞最常常被利用的地方。也是危害最大的地方。
都知道對于一個站點來說,能夠說數(shù)據(jù)庫存放著站點全部的信息,WEB應(yīng)用程序全然是憑借數(shù)據(jù)庫中的信息進行正常的執(zhí)行的。一個站點程序中,最關(guān)鍵的一個部分就是對用戶的合法性的推斷,也就是看訪問它的用戶是不是一個注冊的用戶。
這個時候。就會要求輸入username和password,然后依據(jù)輸入的信息查詢數(shù)據(jù)庫。推斷是否存在用戶,并檢查password是不是一致,假設(shè)一致則承認(rèn)合法用戶。否則將給予非法提示。以下看一段經(jīng)常出如今論壇程序中的用戶認(rèn)證程序代碼:
(1)admin1 = trim(request("name"))
(2)password1 = trim(request("password"))
(3)Set rs = Server.CreateObject ("ADODB.Recordset")
(4)sql = "select * from userlogin where name='"&admin1&"' and password='"&password1&"'"
(5)rs.Open sql,conn,1,1
(6)if rs.eof and rs.bof then
(7)response.write"<SCRIPT language=JavaScript>alert('username或password不對!')"
(8)response.write"javascript:history.go(-1)</SCRIPT>"
(9)response.end
(10)else
(11)session("name")=rs("name")
(12)session("password")=rs("password")
(13)response.Redirect("default.asp")
(14)end if
這段程序的第1和第2行分別通過Request對象獲得username和password,第3行是建立一個數(shù)據(jù)庫操作集對象。第4行就是將username以及password同一時候作為查詢條件放入到userlogin表中進行查詢,第5到第14行就是依據(jù)查詢結(jié)果進行推斷,彈出警告窗體。或者重定向網(wǎng)頁。
如果數(shù)據(jù)庫中有個用戶guest。密碼123456,那么該用戶登錄時,認(rèn)證代碼中的第4行則變?yōu)?#xff1a;sql = "select * from userlogin where name='guest' and password='123456'"。這是一個合法查詢語句。所以用戶能正常登錄。反之則登錄不了。
看起來這是一個比較嚴(yán)格的認(rèn)證代碼,可是事實呢?
如今,我們username提交“'or 1='1”,password也是一樣,相同也會成為合法用戶。這是為什么?
當(dāng)我們提交表單后,代碼通過Request對象獲得提交的username'or 1='1以及password'or 1='1后,直接將這些數(shù)據(jù)放入了第4行的查詢語句中,于是變成了這樣:sql = "select * from userlogin where name=''or 1='1' and password=''or 1='1'"。我們先看1='1',這個絕對永遠(yuǎn)為真,假設(shè)你說假。那么你回小學(xué)學(xué)數(shù)學(xué)吧,學(xué)好再來看吧,呵呵~注意在大馬前面另一個or,這代表者1='1'是作為一個條件選擇語句放入數(shù)據(jù)庫查詢的,這樣不管查詢語句中的username與password是否正確。都會由于or后面的1='1'代碼,導(dǎo)致查詢語句返回值永遠(yuǎn)為真,這樣就是繞過了看似嚴(yán)格的用戶認(rèn)證,獲得了合法的權(quán)限。
注意事項
非常多軟件程序與站點程序一樣,都具實用戶登錄這種機制,假設(shè)軟件的登錄功能與上述的一樣存于SQL注入漏洞的話,然后,該軟件無用的登錄功能版權(quán)聲明:本文博主原創(chuàng)文章。博客,未經(jīng)同意不得轉(zhuǎn)載。
轉(zhuǎn)載于:https://www.cnblogs.com/zfyouxi/p/4817309.html
總結(jié)
以上是生活随笔為你收集整理的什么是简单的分析SQL注入漏洞的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [BZOJ 1012] [JSOI 20
- 下一篇: require.js的基本用法