趙 靜
(天津工業(yè)職業(yè)學(xué)院,天津 300400)
SQL注入技術(shù)最早出現(xiàn)在20世紀(jì)90年代,在我國則是在2002年后。微軟中國技術(shù)中心從腳本注入式攻擊和惡意用戶輸入兩個方面對其進(jìn)行描述,進(jìn)而影響執(zhí)行的腳本。SQL注入攻擊可以描述為攻擊者利用SQL命令將請求的查詢字符串插入Web表單遞交或輸入域名或頁面,讓后臺數(shù)據(jù)庫執(zhí)行惡意代碼的命令,并根據(jù)程序返回的結(jié)果,獲取需要的數(shù)據(jù)信息。
SQL注入是指Web應(yīng)用程序沒有判斷用戶輸入數(shù)據(jù)的合法性或者對其過濾不嚴(yán)格,導(dǎo)致攻擊者可以在應(yīng)用程序中的已經(jīng)定義好的查詢語句中添加額外的語句,在管理員不知道的情況下進(jìn)行操作,欺騙數(shù)據(jù)庫服務(wù)器執(zhí)行非授權(quán)的任意查詢操作,得到相應(yīng)的數(shù)據(jù)信息。SQL注入通過正常的www端口進(jìn)行訪問,而且從表面上看和一般的頁面訪問沒有什么不同,假如管理員不經(jīng)常查看日志,那么可能很長時(shí)間都不會知道服務(wù)器被黑客入侵了。SQL在注入的時(shí)候會發(fā)生很多意想不到的情況。黑客需要構(gòu)造語句,獲取想要的數(shù)據(jù)。SQL注入攻擊通過操作輸入來修改語句,從而執(zhí)行代碼對服務(wù)器進(jìn)行攻擊;在表單、輸入域名和頁面請求的查詢字符串中插入數(shù)據(jù)庫語句命令,最終使用Web服務(wù)器執(zhí)行惡意命令。
SQL注入最常用的方法包括注入判斷法和單引號法。
首先,開發(fā)人員在執(zhí)行操作時(shí),需要區(qū)分?jǐn)?shù)字、字符串、用戶表名是數(shù)字型還是帶引號類型的。其次,查找內(nèi)聯(lián)注入。內(nèi)聯(lián)注入是指在插入查詢注入代碼后,原來的查詢不受影響,仍會全部執(zhí)行。最后,終止式注入。終止式語句注入是指黑客在注入代碼時(shí),可以注釋剩下的查詢,利用這種方式成功結(jié)束該語句。
1.4.1 基于布爾的盲注手法
Web的頁面返回值只有真或假,布爾盲注手法是注入后根據(jù)頁面返回值得到數(shù)據(jù)庫信息的一種辦法。1.4.2 基于時(shí)間的盲注手法
當(dāng)布爾型注入沒有報(bào)錯也就是頁面顯示正常的時(shí)候,技術(shù)人員不能夠判斷是否執(zhí)行了注入的代碼,也可以說不確定這個注入點(diǎn)是否存在,這個時(shí)候布爾型注入就無法發(fā)揮自己的作用。此時(shí),基于時(shí)間的盲注手法應(yīng)運(yùn)而生?;跁r(shí)間的盲注手法就是技術(shù)人員根據(jù)頁面相應(yīng)的時(shí)間差來判斷該頁面是否存在一定的注入點(diǎn)。
1.4.3 聯(lián)合查詢注入手法
使用聯(lián)合查詢進(jìn)行注入的前提是注入的頁面必須有顯示位。聯(lián)合查詢注入手法就是使用合并兩個或多個選擇語句的結(jié)果集,所以兩個及以上的選擇語句必須有相同的列,且各列的數(shù)據(jù)類型也都相同。聯(lián)合查詢注入可在鏈接最后添加order by,基于隨意數(shù)字的注入,根據(jù)頁面的返回結(jié)果來判斷站點(diǎn)中的字段數(shù)目[1]。1.4.4 基于錯誤信息的注入手法
此手法是在頁面沒有顯示位,函數(shù)輸出了錯誤信息的時(shí)候方能使用。優(yōu)點(diǎn)是注入速度快,缺點(diǎn)是語句較為復(fù)雜,而且只能依次進(jìn)行猜解??傮w來說,報(bào)錯注入是一種公式化的注入方法,主要在頁面中沒有顯示位而輸出了錯誤信息時(shí)使用。
進(jìn)行注入時(shí)一般會用到兩種方式,一種是手工注入的方式,還有一種是利用工具注入。
第一步,注入點(diǎn)探測。探測注入點(diǎn)是關(guān)鍵的一步,研究者通過適當(dāng)?shù)貙?yīng)用程序進(jìn)行分析,可以判斷什么地方存在注入點(diǎn)。帶有輸入提交的動態(tài)網(wǎng)頁和從動態(tài)網(wǎng)頁訪問的數(shù)據(jù)庫,都可能存在注入漏洞。如果程序員信息安全意識不強(qiáng),采用動態(tài)構(gòu)造語句訪問數(shù)據(jù)庫,并且對用戶的輸入內(nèi)容未進(jìn)行有效性驗(yàn)證,則存在注入漏洞的可能性很大。一般技術(shù)人員通過頁面的報(bào)錯信息內(nèi)容來確定是否存在注入漏洞。第二步,收集后臺數(shù)據(jù)庫信息。不同數(shù)據(jù)庫的注入方法函數(shù)都不盡相同。因此在注入之前,技術(shù)人員先要判斷一下數(shù)據(jù)庫的類型。判斷數(shù)據(jù)庫類型的方法有很多,可以輸入特殊字符,比如單引號讓程序返回錯誤信息,技術(shù)人員根據(jù)錯誤信息提示進(jìn)行判斷。除此之外,技術(shù)人員還可以使用特定函數(shù)來判斷。第三步,猜解用戶名和密碼。數(shù)據(jù)庫中的表和字段命名一般都是有規(guī)律的。通過構(gòu)造特殊語句在數(shù)據(jù)庫中依次猜解出表名、字段名、字段數(shù)、用戶名和密碼。第四步,查找Web后臺管理入口。后臺管理通常不對普通用戶開放,要找到后臺管理的登錄網(wǎng)址,可以利用目錄掃描工具,如御劍等,快速搜索到可能的登錄地址,然后逐一嘗試,便可以找到后臺管理平臺的登錄網(wǎng)址。第五步,入侵。一般后臺管理具有較高的權(quán)限和較多的功能,使用前面已經(jīng)破譯的用戶名和密碼成功登錄后臺管理平臺后,就可以任意進(jìn)行破壞,比如上傳木馬、篡改網(wǎng)頁、修改和竊取信息等,還可以進(jìn)一步提權(quán),入侵Web服務(wù)器和數(shù)據(jù)庫服務(wù)器[2]。
(1)廣泛性,SQL注入攻擊的目標(biāo)非常的廣泛,它可以跨越各種操作系統(tǒng)進(jìn)行攻擊。任何一個基于SQL語言的數(shù)據(jù)庫都可能會被攻擊,很多開發(fā)人員在編寫Web應(yīng)用程序時(shí)沒有對從輸入?yún)?shù)表單接收到的值進(jìn)行規(guī)范性驗(yàn)證和檢測,通常會出現(xiàn)注入漏洞。而且當(dāng)前大家都在廣泛應(yīng)用Web應(yīng)用程序,而Web存在的漏洞相似程度都很高。(2)隱蔽性,注入語句一般都嵌入在普通的HTTP請求中,很難與正常語句進(jìn)行區(qū)別,所以當(dāng)前許多防火墻都沒有辦法識別并予以警告,而且注入變種非常多,攻擊者可以調(diào)整攻擊的參數(shù),所以使用傳統(tǒng)的方法防御注入效果非常不理想。(3)攻擊時(shí)間短,操作方便??稍诙潭處酌氲綆追昼妰?nèi)完成數(shù)據(jù)竊取、木馬種植、對整個數(shù)據(jù)庫或Web服務(wù)器進(jìn)行控制,而且互聯(lián)網(wǎng)上有很多注入工具,攻擊過程簡單,不需要專業(yè)知識也能自如運(yùn)用[3]。(4)危害大,攻擊者通過注入獲取到服務(wù)器的庫名、表名、字段名,從而獲取到整個服務(wù)器中的數(shù)據(jù),對網(wǎng)站用戶的數(shù)據(jù)安全性有極大的威脅。攻擊者也可以通過獲取到的數(shù)據(jù),得到后臺管理員的密碼,然后對網(wǎng)頁頁面進(jìn)行惡意篡改。這樣不僅對數(shù)據(jù)庫信息安全造成嚴(yán)重威脅,對整個數(shù)據(jù)庫系統(tǒng)安全也影響重大。
1.7.1 檢測方式
SQL注入攻擊檢測方式可以分為兩個方面,即入侵前的檢測以及入侵后的檢測。不同的檢測也具有不同的方式,入侵前的檢測可以通過手工方式和注入工具軟件。注入攻擊后的檢測是針對日志的檢測,黑客注入成功后,會在log和數(shù)據(jù)庫中留下記錄。
1.7.2 檢測方法
對于數(shù)據(jù)庫查詢來說,動態(tài)的SQL語句是非常強(qiáng)大的工具,但是如果把用戶輸入和它放在一起就很有可能被黑客注入。存儲過程在接收用戶輸入的時(shí)候是作為參數(shù)而不是SQL命令,這樣就大大限制了入侵者的行動。當(dāng)然,這種情況不適合用在以下方面,即存儲過程中利用用戶輸入來生成SQL命令。這時(shí),依舊能夠正常執(zhí)行用戶輸入的命令,數(shù)據(jù)庫仍然有可能存在注入風(fēng)險(xiǎn)。如果一個輸入框規(guī)定只能包括數(shù)字,在輸入的時(shí)候就要對輸入內(nèi)容進(jìn)行嚴(yán)格的驗(yàn)證,即保證輸入的是數(shù)字。如果允許有字母輸入,那么就要檢測是否存在不合法的字符。黑客使用軟件工具進(jìn)行攻擊后,一些臨時(shí)表會生成,并且會保存在數(shù)據(jù)庫中。技術(shù)人員要想判斷是否發(fā)生過注入攻擊可以通過查看數(shù)據(jù)庫中最近新建的表的結(jié)構(gòu)內(nèi)容。日志檢查如果啟用了日志記錄,那么訪問者的訪問文件和IP地址都會被記錄下來。判斷是否發(fā)生過注入攻擊可以通過查看日志文件的大小和內(nèi)容。
打開實(shí)訓(xùn)平臺,通過瀏覽器打開目標(biāo)地址,在地址后加提交單引號,頁面返回錯誤,然后提交and 1=1頁面返回正常,然后再提交and 1=2頁面返回錯誤,提交and exists(select * from admin_user)判斷是否存在相應(yīng)的表,如果存在頁面錯誤則返回正常,如果不存在,頁面返回錯誤。頁面返回正常,說明存在相應(yīng)的表,然后用同樣的方法繼續(xù)提交語句來判斷字段名中的用戶名和密碼,如果存在用戶名和密碼字段則頁面返回正常,如果不存在則返回錯誤。頁面返回正常然后判斷當(dāng)前頁面字段數(shù),Order by 11頁面返回錯誤,修改為10頁面返回正常說明當(dāng)前頁面有十個字段,然后提交聯(lián)合查詢語句,頁面顯示2和7,則在相應(yīng)的位置上替換用戶名和密碼字段,得到字段值。
對于數(shù)據(jù)庫攻擊而言,SQL注入攻擊技術(shù)是目前主要方式之一。它利用惡意構(gòu)造數(shù)據(jù)庫語句,或者嵌入SQL語句到注入點(diǎn),最終獲取相應(yīng)的數(shù)據(jù)庫中的數(shù)據(jù)。大多數(shù)的應(yīng)用程序存在注入點(diǎn),主要原因是程序員動態(tài)拼接了傳入的參數(shù),從而使得黑客可以構(gòu)造想要執(zhí)行的語句,出現(xiàn)數(shù)據(jù)泄露問題。