雷蕾
摘 要:隨著科技的進(jìn)步,計(jì)算機(jī)技術(shù)發(fā)展迅速,愈來(lái)愈多的系統(tǒng)、平臺(tái)、軟件在存儲(chǔ)相應(yīng)數(shù)據(jù)之時(shí)使用數(shù)據(jù)庫(kù),使用數(shù)據(jù)庫(kù)便會(huì)用到SQL語(yǔ)言,文章分析說(shuō)明了什么是SQL注入,SQL注入的特點(diǎn)原理,討論了常見(jiàn)的一些SQL注入方法,根據(jù)不同的方法給出防范SQL注入相應(yīng)的技術(shù)措施。
關(guān)鍵詞:SQL注入的分類;SQL注入攻擊;SQL注入防范;
1. SQL注入產(chǎn)生的原因
SQL注入攻擊是因?yàn)榫幊倘藛T在編寫(xiě) SQL語(yǔ)句時(shí),不能正確地寫(xiě)出 SQL語(yǔ)句,也不能對(duì)特定的字符進(jìn)行篩選,從而使客戶端能夠在全局變量 POST和 GET的基礎(chǔ)上,實(shí)現(xiàn)對(duì) SQL的遠(yuǎn)程訪問(wèn)。SQL注入語(yǔ)言是屬于拼接式的語(yǔ)言,尤其其查詢條件字符串也可以拼接而成,注入者違反程序設(shè)計(jì)者的初衷,拼接了合法的和非法的查詢條件,形成含有 SQL 注入的 SQL 語(yǔ)句[1]。
2. SQL注入攻擊原理
很多系統(tǒng)、平臺(tái)、軟件使用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)數(shù)據(jù)信息,而SQL語(yǔ)句命令是連接前端web端和后端數(shù)據(jù)庫(kù)之間的一個(gè)接口,都需要使用SQL語(yǔ)句來(lái)查詢數(shù)據(jù)的存儲(chǔ)情況、位置等,從而返回用戶需要查找的信息。因?yàn)殚_(kāi)發(fā)人員的編程水平參差不齊,在程序設(shè)計(jì)中沒(méi)有對(duì)某些字符進(jìn)行正確性的審查和篩選,從而使攻擊者在 URL連接、表單域中輸入SQL指令,從而發(fā)現(xiàn)了數(shù)據(jù)庫(kù)中的敏感信息,從而形成 SQL注入攻擊。
3. SQL注入攻擊實(shí)例
(1)我們首先需要尋找注入點(diǎn),先在url參數(shù)后添加單引號(hào)觀察回顯,加單引號(hào)會(huì)導(dǎo)致SQL語(yǔ)句執(zhí)行錯(cuò)誤,當(dāng)前頁(yè)面可能會(huì)報(bào)錯(cuò)或者出現(xiàn)查詢內(nèi)容不回顯的情況比較經(jīng)典的“1=1”、“1=2”測(cè)試法。
(2)若是已經(jīng)需找到了注入點(diǎn),http://xxx.xxx.xxx/yes?id=xx后面追加“and 1=1并訪問(wèn)該網(wǎng)址即http://xxx.xxx.xxx/yes?id=xx and 1=1應(yīng)該與訪問(wèn)原地址得到的結(jié)果相同。在http://xxx.xxx.xxx/abcd.asp?p=xx后面追加“and 1=2并訪問(wèn)該網(wǎng)址即http://xxx.xxx.xxx/abcd.asp?p=xx and l=2應(yīng)該與訪問(wèn)原地址得到的結(jié)果不同,且提示數(shù)據(jù)庫(kù)錯(cuò)誤。這就說(shuō)明網(wǎng)址存在SQL注入漏洞。
(3)通過(guò)在url后構(gòu)造一些特殊的SQL語(yǔ)句在數(shù)據(jù)庫(kù)中查找我們所需要知道的信息,如表名、用戶名、列名、數(shù)據(jù)庫(kù)名、密碼等信息。
4. SQL注入的分類
(1)數(shù)字型注入:當(dāng)輸入的參數(shù)為整型時(shí),如id、年齡等,如果存在注入漏洞,則可以認(rèn)為是數(shù)字型注入。對(duì)于Java、C#這類強(qiáng)類型語(yǔ)言,如果試圖把一個(gè)字符串轉(zhuǎn)換為int類型,則會(huì)拋出異常,無(wú)法繼續(xù)執(zhí)行。所以,強(qiáng)類型的語(yǔ)言很少存在數(shù)字型注入漏洞,絕大多數(shù)存在于弱類型語(yǔ)言。
(2)字符型注入:如果是參數(shù)是字符串時(shí)被稱作字型。數(shù)字型和字型注入的最大不同是:數(shù)字型不要求單引號(hào)封閉,而通常采用單引號(hào)封閉。
(3)報(bào)錯(cuò)注入:報(bào)錯(cuò)注入使用的是在數(shù)據(jù)庫(kù)的錯(cuò)誤信息會(huì)返回顯示在網(wǎng)頁(yè)上,我們需要構(gòu)造一些語(yǔ)句使得數(shù)據(jù)庫(kù)產(chǎn)生報(bào)錯(cuò)信息返回至網(wǎng)頁(yè)上。
(4)布爾盲注:布爾型盲注就是在頁(yè)面沒(méi)有錯(cuò)誤顯示時(shí)進(jìn)行注入攻擊,我們需要對(duì)語(yǔ)句進(jìn)行構(gòu)造且讓頁(yè)面呈現(xiàn)出兩種不同的狀態(tài),分別是TRUE和FALSE,可以根據(jù)這兩種狀態(tài)判斷我們輸入語(yǔ)句是否查詢成功。
(5)時(shí)間盲注:時(shí)間盲注也叫做延時(shí)注入,在既沒(méi)有回顯顯示數(shù)據(jù)庫(kù)反饋的內(nèi)容,又沒(méi)有顯示報(bào)錯(cuò)信息,也沒(méi)有布爾型狀態(tài)時(shí),我們可以選擇延時(shí)注入。這里需要用到一個(gè) MySQL 的 sleep(n)函數(shù),功能是休眠 n 秒,sleep()函數(shù)執(zhí)行是有條件的,必須保障 SQL 語(yǔ)句執(zhí)行結(jié)果存在數(shù)據(jù)記錄,才會(huì)停止指定的秒數(shù),如果 SQL 語(yǔ)句查詢結(jié)果為空,那么 sleep函數(shù)不會(huì)停止[1]。
(6)寬字節(jié)注入:寬字節(jié)注入準(zhǔn)確來(lái)說(shuō)不是注入手法,它是一種較為特殊的注入情況,在我們測(cè)試?Id=1’時(shí)會(huì)發(fā)現(xiàn)單引號(hào)并沒(méi)有被帶入進(jìn)去,而是被轉(zhuǎn)義處理了,轉(zhuǎn)義后的單引號(hào)不再具有作用,變成了輸入的內(nèi)容,要想成功注入就需要對(duì)這個(gè)轉(zhuǎn)義進(jìn)行處理。
5. SQL注入的方法
在系統(tǒng)開(kāi)發(fā)后期需要進(jìn)行SQL注入攻擊測(cè)試。SQL注入攻擊測(cè)試通常分為手工測(cè)試和自動(dòng)測(cè)試。下面分別介紹一下這兩種測(cè)試方法[2]:
(1)手動(dòng)測(cè)試
手動(dòng)測(cè)試SQL注入是確定數(shù)據(jù)庫(kù)中是否存在SQL漏洞的一種常見(jiàn)方式。測(cè)試人員可以通過(guò)檢查返回的錯(cuò)誤信息和嘗試猜測(cè)數(shù)據(jù)庫(kù)的結(jié)構(gòu)來(lái)查看漏洞。手工測(cè)試比較直觀,但由于分析返回的錯(cuò)誤信息和嘗試猜測(cè)數(shù)據(jù)庫(kù)的結(jié)構(gòu)比較繁瑣且需要的時(shí)間和精力較多,而且并不是所有的SQL注入漏洞都能夠被發(fā)現(xiàn)。
(2)自動(dòng)測(cè)試
如果是大型或者復(fù)雜的系統(tǒng),人工測(cè)試無(wú)法確保能夠檢測(cè)出 SQL注入點(diǎn)或是是否存在SQL注入;這時(shí),我們可以以“黑客”方式,利用這些工具,對(duì)相應(yīng)的系統(tǒng)進(jìn)行 SQL注入,從而發(fā)現(xiàn)從外部可以攻破的漏洞,因此可以修改程式的參數(shù)和程式碼,這樣被稱作是自動(dòng)化檢測(cè)。自動(dòng)化檢測(cè)是使用一些工具的,例如最常用到的SQLmap,它是可以自動(dòng)檢測(cè)并且可以利用SQL注入漏洞直接獲取數(shù)據(jù)庫(kù)的相關(guān)信息,包括訪問(wèn)底層文件系統(tǒng)、數(shù)據(jù)庫(kù)指紋識(shí)別等。
6. 對(duì)SQL注入的防范
盡管對(duì)系統(tǒng)安全費(fèi)盡心思,裝補(bǔ)丁、安防火墻、裝殺毒軟件,但防火墻與殺毒軟件對(duì)注入是沒(méi)辦法防范的,因?yàn)樽⑷肴肭指胀ǖ捻?yè)面訪問(wèn)沒(méi)什么區(qū)別[3]。主要的SQL注入防范方法有:
(1)分級(jí)管理
權(quán)限等級(jí)管理,權(quán)限管理嚴(yán)格,一般用戶不得給予建立、刪除、修改等相關(guān)權(quán)限,僅由管理員擁有增刪改查的權(quán)限。
(2)二次過(guò)濾
為了保證數(shù)據(jù)的安全,SQL注入要對(duì)輸入和提交的變量進(jìn)行轉(zhuǎn)換、過(guò)濾和篩選,以避免SQL注入,尤其是單引號(hào)、雙引號(hào)等字符,然后,依據(jù)程序的功能和用戶的輸入進(jìn)行二次篩選,保證了系統(tǒng)的安全。
(3)參數(shù)傳值
編程人員在編寫(xiě) SQL時(shí),不能直接向 SQL中寫(xiě)入變量,而要將相關(guān)的變量設(shè)定為參數(shù)。這樣就可以阻止 SQL的插入。在此基礎(chǔ)上,對(duì)輸入的信息進(jìn)行篩選,篩選出不可靠的信息?;蚴褂脜?shù)傳值的方法來(lái)傳輸輸入變量,從而最大限度地防止 SQL注入的入侵。
7.總結(jié)
SQL注入攻擊作為當(dāng)前Web應(yīng)用安全熱點(diǎn)之一,從1998 年第一次出現(xiàn)至今,已有10年發(fā)展歷史,被廣為利用并持續(xù)發(fā)展[4]。要想有效的防護(hù)SQL注入攻擊,需要采用系統(tǒng)、綜合的方式來(lái)解決,需要每個(gè)人一起共同努力。
參考文獻(xiàn)
[1] 翟寶峰. SQL注入攻擊的分析與防范[J]. 遼寧工業(yè)大學(xué)學(xué)報(bào)(自然科學(xué)版),2021,41(3):141-143,147. DOI:10.15916/j.issn1674-3261.2021.03.001.
[2] 徐鑫濤. 淺析SQL注入攻擊[J]. 中國(guó)科技信息,2007(1):97,99. DOI:10.3969/j.issn.1001-8972.2007.01.048.
[3] 遲國(guó)棟,錢(qián)英軍,姚麗麗. SQL注入攻擊與防范[J]. 世紀(jì)橋,2007(3):72-73. DOI:10.3969/j.issn.1001-0475.2007.03.032.