摘 要:針對WEB應(yīng)用安全問題中最常見到的SQL注入攻擊,本文對攻擊的原理、手段和過程做了介紹和剖析,并針對SQL注入的特點指出了對于提高網(wǎng)站安全的策略。
關(guān)鍵詞:SQL注入;WEB安全;網(wǎng)站防護措施
引言
近年來,WEB應(yīng)用成為了人們?nèi)粘I?、工作、學(xué)習中必不可少的工具和信息來源,隨之而來的是信息安全問題層出不窮。2016年國內(nèi)某專業(yè)信息安全平臺被發(fā)現(xiàn)存在SQL注入漏洞,導(dǎo)致大量用戶信息被泄露。由于絕大多數(shù)當今網(wǎng)站都是通過數(shù)據(jù)庫存儲用戶信息和網(wǎng)站數(shù)據(jù),這導(dǎo)致SQL注入攻擊成為網(wǎng)站最常見到的安全風險來源之一。
1.SQL注入攻擊原理
SQL注入攻擊是通過操作輸入來修改SQL語句,用以達到執(zhí)行代碼對WEB服務(wù)器進行攻擊的方法。簡單的說就是在post/get web表單、輸入域名或頁面請求的查詢字符串中插入SQL命令,最終使web服務(wù)器執(zhí)行惡意命令的過程??梢酝ㄟ^一個例子簡單說明SQL注入攻擊。
假設(shè)某網(wǎng)站頁面顯示時URL 為http://www.example.com?test=123,此時URL實際向服務(wù)器傳遞了值為123的變量test,這表明當前頁面是對數(shù)據(jù)庫進行動態(tài)查詢的結(jié)果。由此,我們可以在URL中插入惡意的SQL語句并進行執(zhí)行。另外,在網(wǎng)站開發(fā)過程中,開發(fā)人員使用動態(tài)字符串構(gòu)造SQL語句,用來創(chuàng)建所需的應(yīng)用,這種情況下SQL語句在程序的執(zhí)行過程中被動態(tài)的構(gòu)造使用,可以根據(jù)不同的條件產(chǎn)生不同的SQL語句,比如需要根據(jù)不同的要求來查詢數(shù)據(jù)庫中的字段。這樣的開發(fā)過程其實為SQL注入攻擊留下了很多的可乘之機。
2.SQL注入攻擊常見方法和過程
2.1尋找SQL注入漏洞
確定網(wǎng)站存在SQL注入漏洞的途徑一般有兩種,第一種是可以利用網(wǎng)站的錯誤提示,如果網(wǎng)站開啟了錯誤顯示,攻擊者就可以通過在輸入?yún)?shù)的地方反復(fù)調(diào)整發(fā)送的參數(shù),通過頁面出現(xiàn)的錯誤信息,推測出網(wǎng)站使用的數(shù)據(jù)庫和開發(fā)語言信息。如果網(wǎng)站管理員關(guān)閉了錯誤信息提示,攻擊者可以采用盲注的技巧來進行反復(fù)嘗試。盲注是利用數(shù)據(jù)庫查詢的輸入審查漏洞從數(shù)據(jù)庫提取信息或提取與數(shù)據(jù)庫查詢相關(guān)的信息的技術(shù)。如在URL 中輸入login.php?username=admin and 1=1和login.php?username=admin and 1=2,如果前者能正常返回信息,而后者不能,基本上就可以認定網(wǎng)站存在SQL注入漏洞。這是因為1=2的表達式不成立,所以即使username傳入了正確的數(shù)值也是無法通過,因此可以判讀出該網(wǎng)站可以通過usernamer參數(shù)進行注入。
2.2判斷數(shù)據(jù)庫
獲得網(wǎng)站的數(shù)據(jù)庫類型是SQL注入提取重要數(shù)據(jù)的前提條件之一,可以通過常見的技術(shù)架構(gòu)進行判斷,如aps.net常和SQL Server一起使用,而PHP往往使用MySQL,JSP會配合Oracle或MySLQ。而WEB服務(wù)環(huán)境也可以提供線索,如運行IIS的服務(wù)環(huán)境往往采用SQL Server數(shù)據(jù)庫,使用TOMCAT的更大的可能是MySQL或Oracle。另外,還可以通過詳細的錯誤信息判斷數(shù)據(jù)庫的版本,比如添加單引號作為注入?yún)?shù),根據(jù)數(shù)據(jù)庫產(chǎn)生的語法錯誤信息,就可以判斷出數(shù)據(jù)庫的種類。
2.3攻擊數(shù)據(jù)庫系統(tǒng)
攻擊數(shù)據(jù)庫的目的是為了獲得數(shù)據(jù)庫中有價值的數(shù)據(jù)信息,進而可以為控制整個WEB系統(tǒng)做鋪墊。獲得數(shù)據(jù)庫中數(shù)據(jù)可以遵循層次化的方法,首先提取數(shù)據(jù)庫的名稱,然后提取表、列,最后才是數(shù)據(jù)本身。通常,可以通過訪問專門保存表示各種數(shù)據(jù)庫結(jié)構(gòu)的表,比如MySQL中,這些信息保存在information_schema數(shù)據(jù)庫中。在該數(shù)據(jù)庫中的schemata表中存儲著數(shù)據(jù)庫名,tables表中存儲著表名,columns表中存儲著字段名,通過以上的信息,再獲得數(shù)據(jù)庫表中的內(nèi)容就輕而易舉了。
2.4控制WEB系統(tǒng)
在獲得數(shù)據(jù)庫中數(shù)據(jù)信息后,可以通過對具有管理權(quán)限的賬號信息入手,通過登錄帳號,使用網(wǎng)站后臺上傳功能上傳木馬程序,或添加惡意代碼,最終甚至可以獲得服務(wù)器的完全控制權(quán)限。
3.SQL注入攻擊防護策略
SQL注入漏洞的產(chǎn)生,都是因為系統(tǒng)要接受來自客戶端輸入的變量或者URL傳遞的參數(shù),為此,開發(fā)者一定要遵循“外部數(shù)據(jù)不可信”原則,對于用戶輸入的內(nèi)容或傳遞的參數(shù),要時刻保持警惕。因此對于SQL注入的防護策略通常要確保系統(tǒng)傳遞的變量符合開發(fā)者的設(shè)計要求。
3.1變量檢測
對于數(shù)據(jù)庫中有固定數(shù)據(jù)類型的變量,在SQL語句執(zhí)行前,應(yīng)該對變量的類型進行嚴格的檢查,確保變量是開發(fā)者預(yù)想的。比如系統(tǒng)中存在名為id的數(shù)字字段,那么系統(tǒng)在執(zhí)行SQL語句前確保變量id的類型是int型的。
3.2過濾特殊符號
當發(fā)生SQL注入攻擊時,攻擊者在提交的SQL語句會包含一些特殊的字符或字符串,如單引號、雙引號、反斜杠、NULL等。這樣,可以通過使用數(shù)據(jù)庫系統(tǒng)自帶函數(shù)或編寫相關(guān)驗證程序?qū)τ脩糨斎氲倪@類符號進行轉(zhuǎn)義或者過濾,從而達到限制SQL注入的目的。
3.3合理使用預(yù)編譯
預(yù)編譯是吧一些格式固定的SQL 編譯后,存放在內(nèi)存池中,當需要執(zhí)行相同SQL語句時,就可以直接執(zhí)行以及預(yù)編譯的語句,不同的數(shù)據(jù)庫系統(tǒng)都有預(yù)編譯機制。因此,在當遇到類似login.php?username=admin and 1=1的注入攻擊時,預(yù)編譯SQL語句 WHERE username=?可以阻止攻擊的成功。
3.4對關(guān)鍵數(shù)據(jù)信息加密
對于數(shù)據(jù)庫中諸如賬號密碼的信息應(yīng)該避免使用明文存儲,可以使用AES、RSA、MD5等算法對數(shù)據(jù)進行加密存儲,這樣即使系統(tǒng)被SQL注入成功,攻擊者也無法輕易獲得關(guān)鍵數(shù)據(jù)信息的內(nèi)容。
4.結(jié)語
SQL注入一直是網(wǎng)站重要的安全風險來源,作為網(wǎng)站的開發(fā)者和運維人員應(yīng)該意識到SQL注入攻擊是一種綜合的攻擊手段。為了避免SQL注入帶來的影響,開發(fā)者和運維人員應(yīng)該從網(wǎng)站設(shè)計入手,并對服務(wù)器、數(shù)據(jù)庫管理等多方面加以規(guī)范,確保網(wǎng)站可以安全可靠的運行。
參考文獻:
[1]鄭成興.網(wǎng)絡(luò)入侵防范的理論與實踐[m].機械工業(yè)出版社,2012
[2]黃健.計算機信息安全技術(shù)及防護[J].信息安全與技術(shù),2012,4.
[3]陰國富.基于SQL注人的安全防范檢測技術(shù)研究[J].河南科學(xué),2009,27
[4]李虎軍.淺談網(wǎng)站SQL注入攻擊防護策略研究[J].電腦知識與技術(shù),2016,3
作者簡介:
鄭智釗,男,1983年出生,工學(xué)學(xué)士,網(wǎng)絡(luò)工程師,工作單位:哈爾濱鐵道職業(yè)技術(shù)學(xué)院,主要研究方向:計算機科學(xué)與應(yīng)用。