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