◆羅麗紅 柯 靈 楊華瓊
(重慶電訊職業(yè)學(xué)院 重慶 402247)
web安全之SQL注入漏洞及其防御
◆羅麗紅 柯 靈 楊華瓊
(重慶電訊職業(yè)學(xué)院 重慶 402247)
隨著基于web2.0的互聯(lián)網(wǎng)應(yīng)用的廣泛使用,web的安全問(wèn)題也日益突顯,根據(jù)OWASP的2013和2017的調(diào)查,其中注入攻擊一直排名第一。本文意在對(duì)SQL注入的常用方法進(jìn)行列舉,系統(tǒng)的分析了SQL注入的原理,從而對(duì)SQL注入漏洞提出了一些基本的防御策略。
SQL注入;web安全;防御
在web2.0時(shí)代,基于web的互聯(lián)網(wǎng)應(yīng)用越來(lái)越廣泛,比如大家熟知的百度百科、博客、土豆網(wǎng)等,除這些應(yīng)用之外企業(yè)在信息化過(guò)程中的各種應(yīng)用也都架設(shè)在了web平臺(tái)上。伴隨著Web業(yè)務(wù)的迅速發(fā)展,web的安全問(wèn)題也凸顯了出來(lái),其中黑客會(huì)利用web服務(wù)程序的SQL注入漏洞得到web服務(wù)器的控制權(quán)限,進(jìn)行一系列非法操作,對(duì)系統(tǒng)和用戶(hù)信息造成威脅。根據(jù)OWASP于2017年公布的Web應(yīng)用程序最可能、最常見(jiàn)、最危險(xiǎn)的十大漏洞的排名注入攻擊漏洞排在首位。
什么是SQL注入漏洞?指的是利用現(xiàn)有應(yīng)用程序,將惡意的SQL命令拼接到字符串中,然后插入到web表單提交或輸入域名或頁(yè)面請(qǐng)求的查詢(xún)字符串中,欺騙服務(wù)器執(zhí)行惡意的SQL命令,從而得到攻擊者想要的信息。
首先為了 IE瀏覽器能提示更多的服務(wù)器錯(cuò)誤信息,第一步需要把internet選項(xiàng)高級(jí)設(shè)置中“顯示友好HTTP錯(cuò)誤信息”前的勾去掉。
在網(wǎng)站 URL后面加上單引號(hào)后,比如輸入:www.***.com?id=1’,這樣就在URL中傳遞了變量id,并提供了值1,這樣就嵌入了惡意的SQL語(yǔ)句,對(duì)數(shù)據(jù)庫(kù)進(jìn)行了動(dòng)態(tài)請(qǐng)求,服務(wù)器會(huì)返回錯(cuò)誤的提示信息,如:“Microsoft JET Database Engine 錯(cuò)誤 '80040e14',字符串的語(yǔ)法錯(cuò)誤,在查詢(xún)表達(dá)式'id=1'' 中。/showdetail.asp,行10”。從該錯(cuò)誤提示信息中可以得出:(1)該網(wǎng)站用的是 JET引擎連接的數(shù)據(jù)庫(kù),而不是 JDBC或 ODBC,所以使用的是 access數(shù)據(jù)庫(kù);(2)該網(wǎng)站沒(méi)有對(duì)客戶(hù)提交的參數(shù)進(jìn)行過(guò)濾,存在注入;(3)表中存在“id”字段名。
從上面服務(wù)器的錯(cuò)誤提示可以看出,可以從客戶(hù)端提交的特殊代碼,收集提示信息,得到想得到的資料,這就是SQL注入的原理。
不管是數(shù)字型、字符型還是搜索型注入都可以通過(guò)輸入不同的字符后利用 Web頁(yè)面返回的信息判斷是否存在注入漏洞。下面舉的是當(dāng)存在數(shù)字型注入的情況下的例子:從原有網(wǎng)站“www.***.com?id=1”展示的 URL信息,可知該網(wǎng)站使用了 id這個(gè)字段,并且有1這個(gè)字段值。然后再在瀏覽器的地址欄中分別輸入www.***.com?id=1 and 1=1、www.***.com?id=1 and 1=2,如果輸入前種URL頁(yè)面返回正常,加上1=2之后網(wǎng)站報(bào)錯(cuò),此時(shí)可以判斷該系統(tǒng)存在SQL注入漏洞。
因?yàn)樵诤竺婕由稀癮nd 1=1”后,原來(lái)的查詢(xún)語(yǔ)句可能是這樣的“select * from 表名 where id=1 and 1=1”,由于1=1條件成立,所以執(zhí)行且頁(yè)面返回正常。在后面加上“and 1=2”,原來(lái)的查詢(xún)語(yǔ)句可能是這樣的“select * from 表名 where id=1 and 1=2”,因?yàn)?=2條件不成立,所以會(huì)導(dǎo)致頁(yè)面加載出錯(cuò)。
根據(jù)頁(yè)面反饋信息猜測(cè)得到注入數(shù)據(jù)類(lèi)型、表名、字段名后,再利用SQL語(yǔ)句得出關(guān)鍵字段的值。先利用order by語(yǔ)句來(lái)判斷字段的長(zhǎng)度,如果臨界值為7,則在頁(yè)面注入 order by 7時(shí)則會(huì)報(bào)錯(cuò),從而猜測(cè)列數(shù)為6。再向URL欄注入“and 1=2 union select 1,2,3,4,5,6”后會(huì)將數(shù)據(jù)庫(kù)的列顯露在網(wǎng)頁(yè)上。注 select后面跟的列要與通過(guò)order by猜出的列一致。再利用報(bào)錯(cuò)字段查看數(shù)據(jù)庫(kù)名等基本信息。
為了減少SQL注入漏洞帶來(lái)的損失,應(yīng)采取有效的方法來(lái)防御SQL注入漏洞。
當(dāng)進(jìn)行惡意的SQL查詢(xún)時(shí),黑客會(huì)嘗試在SQL注入時(shí)構(gòu)造一些查詢(xún)語(yǔ)句,使進(jìn)行查詢(xún)時(shí)出現(xiàn)語(yǔ)法或邏輯上的錯(cuò)誤,這些查詢(xún)出錯(cuò)的信息往往是切入點(diǎn),會(huì)提供給黑客大量信息,所以需要對(duì)這些錯(cuò)誤進(jìn)行處理,避免網(wǎng)站顯示類(lèi)似下面的這些信息,如:類(lèi)型錯(cuò)誤、字段不匹配等,防止攻擊者利用這些錯(cuò)誤信息進(jìn)行一些判斷。
將SQL語(yǔ)句預(yù)編譯并綁定變量,如下代碼所示,將id后面的參數(shù)預(yù)先編譯好,參數(shù)化的語(yǔ)句使用參數(shù)而不是將用戶(hù)輸入變量嵌入到SQL語(yǔ)句中,則不管輸入什么參數(shù)都無(wú)法改變本身的語(yǔ)法結(jié)構(gòu)。
對(duì)用戶(hù)輸入的內(nèi)容進(jìn)行限制,限制用戶(hù)提交非法數(shù)據(jù),確保數(shù)據(jù)合法??梢圆捎脤?duì)數(shù)據(jù)類(lèi)型進(jìn)行驗(yàn)證或用正則表達(dá)式來(lái)驗(yàn)證輸入。
比如特殊字符:’”<>&*;等都具有特殊的意義,最常見(jiàn)的SQL注入的特殊符是單引號(hào),因?yàn)閱我?hào)是作為代碼與用戶(hù)輸入數(shù)據(jù)的字符串分隔符,單引號(hào)內(nèi)部的內(nèi)容是用戶(hù)輸入的數(shù)據(jù),外部為SQL代碼。在URL欄或提交參數(shù)的表單中,如果沒(méi)有加入過(guò)濾特殊字符的代碼,并沒(méi)有對(duì)數(shù)據(jù)庫(kù)拋出異常進(jìn)行處理,則數(shù)據(jù)庫(kù)遇到單引號(hào)注入后,會(huì)認(rèn)為是語(yǔ)法錯(cuò)誤,并拋出錯(cuò)誤提示,對(duì)經(jīng)驗(yàn)豐富的黑客來(lái)講這些信息往往是具有價(jià)值的。
比如清除掉所有特殊字符的正則表達(dá)式:
SQL注入漏洞從1998年被發(fā)現(xiàn)后,直到現(xiàn)在還仍然會(huì)對(duì)web應(yīng)用的安全產(chǎn)生極大危害。OWASP在2017年公布的十大最流行web安全漏洞中注入漏洞居榜首,這就更加證實(shí)了這一點(diǎn)。本文列舉了SQL注入的常用方法,分析了注入原理,并給出了三點(diǎn)建設(shè),希望能降低SQL注入漏洞攻擊的概率。
[1] Bitcarmanlee.Web安全之 SQL 注入攻擊技巧與防范[EB/OL].(2016-03-01)[2017-01-09].http://blog.csdn. net/bitcarmanlee/article/details/50945437. Bitcarmanlee.Web Security SQL Injection Attack Skills and Prevention[EB/OL].(2016-03-01)[2017-01-09]. http://blog.csdn.net/bitcarmanlee/article/ details/50945437.
[2] 吳為團(tuán),鄭海燕,張銳麗.基于 Web應(yīng)用程序的 SQL注入攻擊和防范[C].中國(guó)通信學(xué)會(huì)學(xué)術(shù)年會(huì),2015.
[3] 馬俊,段興林.Web應(yīng)用系統(tǒng)中SQL注入的分析與預(yù)防[J].信息技術(shù),2015.
[4] 魏星.基于手工SQL注入的web滲透測(cè)試技術(shù)研究[D].山西:中北大學(xué),2015.