向磊
摘要:該文首先介紹了SQL注入攻擊的原理,對SQL注入攻擊進(jìn)行了分析。同時根據(jù)筆者的日常工作經(jīng)驗總結(jié)除了一套比較完善的SQL注入防范體系,并且根據(jù)SQL注入攻擊的原理以及不同的防范技術(shù),提出了基于客戶端和服務(wù)器端的雙向SQL注入攻擊的防御模型。
關(guān)鍵詞:SQL注入攻擊;SQL攻擊防范;防御模型
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2017)25-0001-02
網(wǎng)絡(luò)安全是信息化的重要基石。網(wǎng)絡(luò)信息涉及國家的軍事、政府、經(jīng)濟(jì)等領(lǐng)域及公民的個人信息,其中許多信息是敏感信息,甚至是機(jī)密信息,而層出不窮的各種安全漏洞和不斷變化的攻擊手段,使得網(wǎng)絡(luò)和信息安全面臨艱巨挑戰(zhàn)。
目前,針對Web應(yīng)用程序和數(shù)據(jù)庫的攻擊已成為網(wǎng)絡(luò)安全隱患的主要方面,其具有技術(shù)門檻低、可繞過安全設(shè)備、攻擊回報高等特點。據(jù)開放Web應(yīng)用程序安全項目近些年的統(tǒng)計中,注入問題仍然是影響網(wǎng)絡(luò)安全最嚴(yán)重的漏洞。在許多安全論壇,SQL注入攻擊也是熱點話題之一,對SQL注入問題的研究非常重要。
1 SQL注入攻擊原理
SQL 注入攻擊是一種攻擊數(shù)據(jù)庫的常見攻擊,主要是由于程序員在編寫程序代碼時,沒有對輸入數(shù)據(jù)的合法性進(jìn)行判斷,導(dǎo)致網(wǎng)頁程序存在安全漏洞。[1]黑客會通過提交一些數(shù)據(jù)庫查詢代碼或者其他惡意代碼,然后根據(jù)程序返回的結(jié)果進(jìn)行判斷分析,從而獲得數(shù)據(jù)庫中黑客需要的信息。SQL注入主要是從80端口進(jìn)行訪問,而且現(xiàn)在很多市面上的防火墻一般不會對SQL注入發(fā)出警報,如果網(wǎng)絡(luò)管理員沒有經(jīng)常查看IIS日志,可能被入侵長時間都不會發(fā)現(xiàn)。因此SQL注入攻擊行為是非常隱蔽的,難以被檢測發(fā)現(xiàn)。
2 SQL注入的實例分析
這段SQL查詢語句是正確的,但是代碼中的“username”和“passWord”這2個值都是用戶登錄提交的。程序員沒有對用戶提交的2個參數(shù)值進(jìn)行判斷,從而留下了漏洞。攻擊者可以通過修改構(gòu)造提交任意的數(shù)據(jù)信息。例如用戶進(jìn)行如下的輸入:用戶輸入為空,在密碼輸入如下代碼:';' drop table users-。信息提交成功后,網(wǎng)站會提示登錄失敗。但真正網(wǎng)站執(zhí)行的不僅是提示登錄失敗,也將數(shù)據(jù)庫中表users也被刪除,當(dāng)用戶再次輸入正確用戶名和密碼后,將出現(xiàn)如下提示信息。用戶表被刪除后,任何用戶都不能進(jìn)行登錄。具體效果如圖1所示。
3 SQL注入攻擊的防范和模型
3.1 SQL注入攻擊的防范
SQL注入攻擊的危害很大,而且防火墻很難對攻擊行為進(jìn)行攔截,那么該如何來防治呢?本文對主要的SQL注入攻擊防范方法進(jìn)行了總結(jié),具體有以下幾個方面。
1) 分級管理
對用戶進(jìn)行分級管理,嚴(yán)格控制用戶的權(quán)限,對于普通用戶,禁止給予數(shù)據(jù)庫建立、刪除、修改等相關(guān)權(quán)限,只有系統(tǒng)管理員才具有增、刪、改、查的權(quán)限。例如上述實例中用戶在查詢語句中加入了drop table??隙ㄊ遣荒茏屍鋱?zhí)行的,否則系統(tǒng)的數(shù)據(jù)庫安全性就無法保障。故而通過權(quán)限的設(shè)計限制。使得即使惡意攻擊者在數(shù)據(jù)提交時嵌入了相關(guān)攻擊代碼。但因為設(shè)置了權(quán)限,從而使得代碼不能執(zhí)行。從而減少SQL注入對數(shù)據(jù)庫的安全威脅。
2) 參數(shù)傳值
程序員在書寫SQL語言時,禁止將變量直接寫入到SQL語句,必須通過設(shè)置相應(yīng)的參數(shù)來傳遞相關(guān)的變量。從而抑制SQL注入。數(shù)據(jù)輸入不能直接嵌入到查詢語句中。同時要過濾輸入的內(nèi)容,過濾掉不安全的輸入數(shù)據(jù)?;蛘卟捎脜?shù)傳值的方式傳遞輸入變量。這樣可以最大程度防范SQL注入攻擊。
3) 基礎(chǔ)過濾與二次過濾
SQL注入攻擊前,入侵者通過修改參數(shù)提交“and”等特殊字符,判斷是否存在漏洞,然后通過select、update等各種字符編寫SQL注入語句。因此防范SQL注入要對用戶輸入進(jìn)行檢查,確保數(shù)據(jù)輸入的安全性,在具體檢查輸入或提交的變量時,對于單引號、雙引號、冒號等字符進(jìn)行轉(zhuǎn)換或者過濾,從而有效防止SQL注入。下面是一個ID變量的過濾代碼,如圖2所示:
當(dāng)然危險字符有很多,在獲取用戶輸入提交的參數(shù)時,首先要進(jìn)行基礎(chǔ)過濾,然后根據(jù)程序的功能及用戶輸入的可能性進(jìn)行二次過濾,以確保系統(tǒng)的安全性。
4) 使用安全參數(shù)
SQL數(shù)據(jù)庫為了有效抑制SQL注入攻擊的影響。在進(jìn)行SQLServer數(shù)據(jù)庫設(shè)計時設(shè)置了專門的SQL安全參數(shù)。在程序編寫時應(yīng)盡量使用安全參數(shù)來杜絕注入式攻擊。從而確保系統(tǒng)的安全性。
SQLServer數(shù)據(jù)庫提供了Parameters集合,它在數(shù)據(jù)庫中的功能是對數(shù)據(jù)進(jìn)行類型檢查和長度驗證,當(dāng)程序員在程序設(shè)計時加入了Parameters集合,系統(tǒng)會自動過濾掉用戶輸入中的執(zhí)行代碼,識別其為字符值。如果用戶輸入中含有惡意的代碼,數(shù)據(jù)庫在進(jìn)行檢查時也能夠?qū)⑵溥^濾掉。同時Parameters集合還能進(jìn)行強(qiáng)制執(zhí)行檢查。一旦檢查值超出范圍。系統(tǒng)就會出現(xiàn)異常報錯,同時將信息發(fā)送系統(tǒng)管理員,方便管理員做出相應(yīng)的防范措施。圖3是Parameters 集合的應(yīng)用實例。
在這個例子中,參數(shù)@au_id被Parameters集合識別為字符值。同時對這個字符值進(jìn)行長度和類型檢查。一旦該字符值不符合對應(yīng)的類型和長度,程序就會引發(fā)異常,從而留下相應(yīng)的日志,方便系統(tǒng)管理員查看和及時防范。
5) 漏洞掃描
為了更有效地防范SQL注入攻擊,作為系統(tǒng)管理除了設(shè)置有效的防范措施,更應(yīng)該及時發(fā)現(xiàn)系統(tǒng)存在SQL攻擊安全漏洞。系統(tǒng)管理員可以通過采購一些專門系統(tǒng)的SQL漏洞掃描工具,通過專業(yè)的掃描工具,可以及時的掃描到系統(tǒng)存在的相應(yīng)漏洞。雖然漏洞掃描工具只能掃描到SQL注入漏洞,不能防范SQL注入攻擊。但系統(tǒng)管理員可以通過掃描到的安全漏洞,根據(jù)不同的情況采取相應(yīng)的防范措施封堵相應(yīng)的漏洞,從而把SQL注入攻擊的門給關(guān)上。從而確保系統(tǒng)的安全。endprint
6) 多層驗證
現(xiàn)在的網(wǎng)站系統(tǒng)功能越來越龐大復(fù)雜。為確保系統(tǒng)的安全,訪問者的數(shù)據(jù)輸入必須經(jīng)過嚴(yán)格的驗證才能進(jìn)入系統(tǒng),驗證沒通過的輸入直接被拒絕訪問數(shù)據(jù)庫,并且向上層系統(tǒng)發(fā)出錯誤提示信息。同時在客戶端訪問程序中驗證訪問者的相關(guān)輸入信息,從而更有效的防止簡單的SQL注入。但是如果多層驗證中的下層如果驗證數(shù)據(jù)通過,那么繞過客戶端的攻擊者就能夠隨意訪問系統(tǒng)。因此在進(jìn)行多層驗證時,要每個層次相互配合,只有在客戶端和系統(tǒng)端都進(jìn)行有效的驗證防護(hù),才能更好地防范SQL注入攻擊。
7) 數(shù)據(jù)庫信息加密
傳統(tǒng)的加解密的方法大致可以分為三種:
(1) 對稱加密:即加密方和解密方都使用相同的加密算法和密鑰,這種方案的密鑰的保存非常關(guān)鍵,因為算法是公開的,而密鑰是保密的,一旦密匙泄露,黑客仍然可以輕易解密。常見的對稱加密算法有:AES、DES等。[2]
(2) 非對稱加密:即使用不同的密鑰來進(jìn)行加解密,密鑰被分為公鑰和私鑰,用私鑰加密的數(shù)據(jù)必須使用公鑰來解密,同樣用公鑰加密的數(shù)據(jù)必須用對應(yīng)的私鑰來解密,常見的非對稱加密算法有:RSA等。
(3) 不可逆加密:利用哈希算法使數(shù)據(jù)加密之后無法解密回原數(shù)據(jù),這樣的哈希算法常用的有:md5、SHA-1等。
但對于數(shù)據(jù)庫系統(tǒng)安全角度來講,我們有迫切的需求采用更好的方法對密碼數(shù)據(jù)進(jìn)行不可逆加密,通常的做法是為每個用戶確定不同的密碼加鹽(salt)后,再混合用戶的真實密碼進(jìn)行md5加密,代碼如圖4所示。
3.2 SQL注入攻擊的防御模型
目前針對SQL注入攻擊防御主要是在服務(wù)器端進(jìn)行部署實施,主要包括服務(wù)器數(shù)據(jù)加密、敏感字符的改寫、嚴(yán)格區(qū)分用戶權(quán)限等。但也存在一些缺點,第一,服務(wù)器端處理數(shù)據(jù)會造成服務(wù)器端壓力過大,網(wǎng)絡(luò)資源損耗。第二,目前編寫動態(tài)網(wǎng)頁程序的語言有很多種,各種程序腳本對應(yīng)不同的SQL注入方法。
根據(jù)上述缺陷,本文提出基于客戶端和服務(wù)器端兩級檢查的防御模型。分別在客戶端和服務(wù)器端進(jìn)行檢查,模型如圖5所示。用戶在訪問網(wǎng)頁和進(jìn)行提交信息時,用戶數(shù)據(jù)發(fā)送到服務(wù)器端之前,在客戶端進(jìn)行驗證,檢查是否存在非法輸入數(shù)據(jù),一旦檢查為非法信息,直接過濾掉。不再提交到服務(wù)器驗證,從而減輕了服務(wù)器的驗證壓力。增強(qiáng)系統(tǒng)的安全性。
服務(wù)器接受到提交的數(shù)據(jù)時,對用戶輸入數(shù)據(jù)再次進(jìn)行驗證,沒有通過驗證的直接禁止訪問,直接返回錯誤頁面提示。同時對輸入的字符串與系統(tǒng)設(shè)計好的規(guī)則庫進(jìn)行查詢比較。然后再進(jìn)行權(quán)限比對。如果超出權(quán)限就直接禁止訪問。一旦上述檢查都不合法,則形成相應(yīng)日志,并且發(fā)送報告給系統(tǒng)管理員。如果檢查都通過,則為合法的訪問,允許其通過。
4 結(jié)束語
SQL注入攻擊漏洞是網(wǎng)站系統(tǒng)的重大安全隱患,SQL注入攻擊對系統(tǒng)數(shù)據(jù)庫的影響非常大,本文就SQL注入攻擊的原理進(jìn)行了闡述,并且對SQL注入攻擊進(jìn)行了實例分析,提出了一套有效的SQL注入攻擊防范方法。并且設(shè)計了基于客戶端和服務(wù)器端的SQL注入攻擊防御模型,能夠有效的抵御SQL注入攻擊,具有一定的實用和參考價值。
參考文獻(xiàn):
[1] 王希忠,吳瓊,黃俊強(qiáng),等.SQL注入攻擊安全防護(hù)技術(shù)研究[J].信息技術(shù),2014(9).
[2] 丁允超,范小花.SQL注入攻擊原理及其防范措施[J].重慶科技學(xué)院學(xué)報:自然科學(xué)版,2012(5).endprint