汪冰 黃銀蓉
摘要:數(shù)據(jù)庫技術(shù)在計算機(jī)網(wǎng)絡(luò)和互聯(lián)網(wǎng)絡(luò)中起著至關(guān)重要的作用。在各種web應(yīng)用場景下,都有數(shù)據(jù)庫技術(shù)參與。SQL Server、Access、Oracle、MySQL等一系列數(shù)據(jù)庫管理系統(tǒng)被廣泛使用。作為web應(yīng)用結(jié)構(gòu)中的存儲層,數(shù)據(jù)庫服務(wù)器通過web應(yīng)用服務(wù)器與瀏覽器之間完成數(shù)據(jù)交互。在交互過程中經(jīng)常會面對各種網(wǎng)絡(luò)安全風(fēng)險,其中以SQL注入攻擊最為普遍。本文對數(shù)據(jù)庫安全基本要求、web應(yīng)用中數(shù)據(jù)庫運轉(zhuǎn)原理進(jìn)行論述,闡述了國內(nèi)外對數(shù)據(jù)庫系統(tǒng)運行安全和數(shù)據(jù)庫系統(tǒng)信息安全的相關(guān)標(biāo)準(zhǔn);以C/S模式為例,說明了web應(yīng)用的三層架構(gòu)。本文以SQL Server為例,列舉并實踐了幾種常見的SQL注入語句;利用自動注入工具SQLMap對特定網(wǎng)站進(jìn)行SQL注入。本文以ASP等編程語言為例,簡單介紹了幾種行之有效并被廣泛使用的SQL注入防御手段。
關(guān)鍵詞:數(shù)據(jù)庫安全;web應(yīng)用;SQL注入;SQL注入防御
1.數(shù)據(jù)庫安全基本要求及威脅來源
數(shù)據(jù)庫及其相關(guān)技術(shù)在快速發(fā)展的計算機(jī)、互聯(lián)網(wǎng)應(yīng)用中起著至關(guān)重要的作用。幾乎所有常見的網(wǎng)站、web應(yīng)用程序和移動終端應(yīng)用程序都運用了數(shù)據(jù)庫及其相關(guān)技術(shù)。數(shù)據(jù)庫的定義是按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的倉庫。它于20世紀(jì)60年代出現(xiàn)并伴隨著計算機(jī)和互聯(lián)網(wǎng)技術(shù)地快速演變在20世紀(jì)90年代后期得到迅速發(fā)展。在其發(fā)展的早期,與數(shù)據(jù)庫安全相關(guān)的防護(hù)技術(shù)并未受到業(yè)界重視。但隨著計算機(jī)和互聯(lián)網(wǎng)的普及,大量合法或不合法的用戶涌入網(wǎng)絡(luò)當(dāng)中,對網(wǎng)絡(luò)安全產(chǎn)生了巨大沖擊,于是業(yè)界開始關(guān)注網(wǎng)絡(luò)安全防護(hù)技術(shù),而數(shù)據(jù)庫安全技術(shù)則屬于網(wǎng)絡(luò)安全防護(hù)技術(shù)當(dāng)中十分重要的一個環(huán)節(jié)。
關(guān)于數(shù)據(jù)庫安全的定義,國內(nèi)外有不同的定義。國外以C. P. Pfleeger 在“Security in Computing – Database Security. PTR,1997”中對數(shù)據(jù)庫安全的定義最具有代表性,被國內(nèi)外許多教材、論文和培訓(xùn)廣泛應(yīng)用。他從以下方面對數(shù)據(jù)庫安全進(jìn)行了描述:
(1)物理數(shù)據(jù)庫的完整性:數(shù)據(jù)庫中的數(shù)據(jù)不被各種自然的或物理的問題而破壞,如電力問題或設(shè)備故障等。
(2)邏輯數(shù)據(jù)庫的完整性:對數(shù)據(jù)庫結(jié)構(gòu)的保護(hù),如對其中一個字段的修改不應(yīng)該破壞其他字段。
(3)元素安全性:存儲在數(shù)據(jù)庫中的每個元素都是正確的。
(4)可審計性:可以追蹤存取和修改數(shù)據(jù)庫元素的用戶。
(5)訪問控制:確保只有授權(quán)的用戶才能訪問數(shù)據(jù)庫,這樣不同的用戶被限制在不同的訪問方式。
(6)身份驗證:不管是審計追蹤或者是對某一數(shù)據(jù)庫的訪問都要經(jīng)過嚴(yán)格的身份驗證。
(7)可用性:對授權(quán)的用戶應(yīng)該隨時可進(jìn)行應(yīng)有的數(shù)據(jù)庫訪問。
我國在數(shù)據(jù)庫安全方面也有自己的定義,在《中華人民共和國公共安全行業(yè)標(biāo)準(zhǔn)GA/T389-2002》中“計算機(jī)信息系統(tǒng)安全等級保護(hù)數(shù)據(jù)庫管理系統(tǒng)技術(shù)要求”部分對數(shù)據(jù)庫安全的定義是:數(shù)據(jù)庫安全就是保證數(shù)據(jù)庫信息的保密性、完整性、一致性和可用性。保密性指保護(hù)數(shù)據(jù)庫中的數(shù)據(jù)不被泄露和未授權(quán)的獲取;完整性指保護(hù)數(shù)據(jù)庫中的數(shù)據(jù)不被破壞和刪除;一致性指確保數(shù)據(jù)庫中的數(shù)據(jù)滿足實體完整性、參照完整性和用戶定義完整性要求;可用性指確保數(shù)據(jù)庫中的數(shù)據(jù)不因人為的和自然的原因?qū)κ跈?quán)用戶不可用。其中保密性、完整性及可用性與信息安全三要素“CIA”相一致。
在實際生產(chǎn)應(yīng)用過程中,數(shù)據(jù)庫一般由數(shù)據(jù)庫管理系統(tǒng)來統(tǒng)一管理和控制,用戶可以通過數(shù)據(jù)庫管理系統(tǒng)訪問數(shù)據(jù)庫,數(shù)據(jù)庫管理員也可以通過它進(jìn)行數(shù)據(jù)庫的維護(hù)工作。常見的SQL Server、Access、Oracle、MySQL等都屬于數(shù)據(jù)庫管理系統(tǒng)。而我們所討論的數(shù)據(jù)庫安全技術(shù)主要就是針對數(shù)據(jù)庫管理系統(tǒng)的。數(shù)據(jù)庫管理系統(tǒng)的安全既要考慮數(shù)據(jù)庫管理系統(tǒng)的安全運行保護(hù),也要考慮對數(shù)據(jù)庫管理系統(tǒng)中所存儲、傳輸和處理的數(shù)據(jù)信息的保護(hù)(包括以庫結(jié)構(gòu)形式存儲的用戶數(shù)據(jù)信息和以其他形式存儲的由數(shù)據(jù)庫管理系統(tǒng)使用的數(shù)據(jù)信息)。由于攻擊和威脅既可能是針對數(shù)據(jù)庫管理系統(tǒng)運行的,也可能是針對數(shù)據(jù)庫管理系統(tǒng)中所存儲、傳輸和處理的數(shù)據(jù)信息的保密性、完成性和可用性的,所以對數(shù)據(jù)庫管理系統(tǒng)的安全保護(hù)的功能要求,需要從系統(tǒng)安全運行和信息安全保護(hù)兩方面綜合進(jìn)行考慮。系統(tǒng)運行安全和系統(tǒng)信息安全即是數(shù)據(jù)庫安全所包含的兩層含義。系統(tǒng)運行安全一般面臨著數(shù)據(jù)庫管理系統(tǒng)本身可用性被破壞的威脅。網(wǎng)絡(luò)中的不法分子通過各種滲透技術(shù)入侵服務(wù)器,通過病毒、木馬等手段致使系統(tǒng)無法正常運轉(zhuǎn),從而造成破壞性的后果;系統(tǒng)信息安全則主要包含保密性和完整性兩個方面的內(nèi)容。網(wǎng)絡(luò)中的不法分子通過注入技術(shù)取得數(shù)據(jù)庫中的各種用戶數(shù)據(jù),甚至可以通過代碼控制對數(shù)據(jù)進(jìn)行惡意刪除和修改,嚴(yán)重破壞數(shù)據(jù)信息的安全。
數(shù)據(jù)庫一般不會獨立存在于互聯(lián)網(wǎng)和計算機(jī)網(wǎng)絡(luò)之中,而是通常作為web應(yīng)用系統(tǒng)和web應(yīng)用程序的后端驅(qū)動技術(shù)而存在。常見的web應(yīng)用系統(tǒng)有辦公自動化系統(tǒng)、電子郵件系統(tǒng)、新聞網(wǎng)站、電子商城等;而常見的web應(yīng)用程序則更為普遍,我們的移動終端上琳瑯滿目的應(yīng)用軟件后端幾乎都有數(shù)據(jù)庫技術(shù)在支撐其運轉(zhuǎn)。圖1說明了web應(yīng)用和數(shù)據(jù)庫服務(wù)器之間的簡單交互關(guān)系(這里只針對C/S模式):
從圖1可以看到,用戶在使用各種web應(yīng)用系統(tǒng)或web應(yīng)用程序的時候,首先通過終端設(shè)備向web應(yīng)用服務(wù)器發(fā)起數(shù)據(jù)請求,web應(yīng)用服務(wù)器收到該請求以后再向數(shù)據(jù)服務(wù)器發(fā)起數(shù)據(jù)請求,數(shù)據(jù)服務(wù)器收到請求后返回響應(yīng)數(shù)據(jù)至web應(yīng)用服務(wù)器,web應(yīng)用服務(wù)器收到響應(yīng)數(shù)據(jù)后再反饋給終端設(shè)備。整個交互過程時間非常短暫,用戶一般不會察覺。但在交互過程中存在多處安全威脅,因此通信運營商和各類互聯(lián)網(wǎng)服務(wù)提供商必須在關(guān)鍵節(jié)點做好安全防護(hù)工作,避免發(fā)生網(wǎng)絡(luò)信息安全事故。而在眾多安全防護(hù)工作中,數(shù)據(jù)庫安全尤為重要,在圖中的網(wǎng)絡(luò)環(huán)境下,我們可以將數(shù)據(jù)庫安全分為3個層次,分別為網(wǎng)絡(luò)安全、服務(wù)器安全和數(shù)據(jù)庫本身的安全。網(wǎng)絡(luò)安全側(cè)重于防護(hù)數(shù)據(jù)交互過程中的網(wǎng)絡(luò)嗅探、跨站腳本攻擊、緩沖區(qū)溢出攻擊、DDOS攻擊等;服務(wù)器安全側(cè)重于操作系統(tǒng)本身的安全,防護(hù)手段主要包括安裝正版操作系統(tǒng)、及時升級補(bǔ)丁、嚴(yán)格控制管理員賬戶權(quán)限、在關(guān)鍵節(jié)點架設(shè)防火墻等;數(shù)據(jù)庫安全側(cè)重于通過代碼審計、數(shù)據(jù)加密、數(shù)據(jù)備份、用戶權(quán)限控制等方式避免網(wǎng)絡(luò)不法分子對數(shù)據(jù)運行安全和數(shù)據(jù)信息安全造成破壞。
在數(shù)據(jù)庫安全面臨的眾多威脅中,SQL注入是最為典型、破壞性最強(qiáng)的攻擊方式。在論述SQL注入以前,先對SQL進(jìn)行一個簡單介紹。SQL最早源于1974年IBM公司圣約瑟研究室研制的大型關(guān)系數(shù)據(jù)庫管理系統(tǒng)System R,其中包括了一套規(guī)范的數(shù)據(jù)庫語言——SEQUEL(Structured English Query Language),后于1980年正式更名為SQL。SQL按照功能一般分為四大類,分別是查詢語言(Data Query Language,DQL)、數(shù)據(jù)操作語言(Data Manipulation Language,DML)、數(shù)據(jù)定義語言(Data Definition Language,DDL)和數(shù)據(jù)控制語言(Data Control Language,DCL),詳見圖2:
2.Web應(yīng)用中的數(shù)據(jù)庫運用原理
從圖1中我們已經(jīng)簡單了解了web應(yīng)用的基本架構(gòu)。主要分為表示層、邏輯層和存儲層(數(shù)據(jù)層)。展示web頁面的瀏覽器就位于表示層。表示層是web應(yīng)用的最高層,一般由用HTML(HyperText Markup Language,超文本標(biāo)記語言)等語言編寫的便于用戶查看的頁面組成。其主要作用就是與用戶進(jìn)行交互,或者說使用便于用戶理解、查看的方式將后臺數(shù)據(jù)呈現(xiàn)給用戶;邏輯層位于表示層與數(shù)據(jù)層之間,在數(shù)據(jù)交換中起承上啟下的作用,是三層架構(gòu)中的核心部分,其主要功能是負(fù)責(zé)在瀏覽器和后臺數(shù)據(jù)庫之間建立交互關(guān)系,將瀏覽器送來的請求指令進(jìn)行加工處理后發(fā)送至數(shù)據(jù)庫,同時將數(shù)據(jù)庫反饋回來的數(shù)據(jù)信息加工處理后傳遞給瀏覽器;數(shù)據(jù)層一般包括數(shù)據(jù)庫服務(wù)器、存儲數(shù)據(jù)的存儲設(shè)備和數(shù)據(jù)信息本身,所以數(shù)據(jù)層通常也被叫做存儲層。數(shù)據(jù)層的主要功能是負(fù)責(zé)數(shù)據(jù)的存儲和檢索,一般數(shù)據(jù)庫服務(wù)器支持訪問數(shù)據(jù)庫文件、二進(jìn)制文件、文本文檔或是XML文檔。圖3將圖1進(jìn)行了細(xì)化,詳細(xì)展示了web應(yīng)用的工作原理:
當(dāng)用戶通過瀏覽器訪問某一個網(wǎng)站時,瀏覽器會將用戶輸入的URL發(fā)送至web應(yīng)用服務(wù)器,web應(yīng)用服務(wù)器將URL進(jìn)行編譯處理,生成特定的SQL語句并發(fā)送至數(shù)據(jù)庫服務(wù)器執(zhí)行,之后數(shù)據(jù)庫服務(wù)器返回數(shù)據(jù)信息至web應(yīng)用服務(wù)器,web應(yīng)用服務(wù)器再將數(shù)據(jù)信息加工處理為HTML并遞送至瀏覽器呈現(xiàn)給用戶。下面看一個實例:
我們通過火狐瀏覽器訪問了URL為http://www.aodiweixiu.com/about.asp?id=1的網(wǎng)頁,在這段URL中除了.com的域名外,后面還出現(xiàn)了“asp?id=1”這串代碼,這其中就涉及到瀏覽器和后臺服務(wù)器之間的參數(shù)傳遞。通過這個參數(shù)輸入節(jié)點,我們就可以通過構(gòu)造特定的SQL語句對該網(wǎng)站的后臺數(shù)據(jù)庫進(jìn)行手工注入,或者直接使用自動注入工具進(jìn)行SQL注入,以破壞該網(wǎng)站數(shù)據(jù)信息的“CIA”三要素。
3.QL注入的防御及數(shù)據(jù)庫訪問控制
SQL注入攻擊嚴(yán)重威脅著數(shù)據(jù)庫的安全,因此,在web應(yīng)用程序設(shè)計和編寫的時候必須采用必要的防護(hù)手段,避免數(shù)據(jù)庫中的重要信息被網(wǎng)絡(luò)中的不法分子竊取。我們可以通過以下三種常見方法對SQL注入攻擊進(jìn)行防御。
3.1輸入驗證防御。
輸入驗證一般分為白名單驗證和黑名單驗證兩種方式。白名單驗證首先建立起白名單規(guī)則,即確定包含在規(guī)則內(nèi)的數(shù)據(jù)全部通過,否則便丟棄或拒絕訪問;黑名單驗證正好相反,首先建立黑名單規(guī)則,在規(guī)則內(nèi)的數(shù)據(jù)禁止通過。白名單驗證的防護(hù)強(qiáng)度一般高于黑名單驗證,在較為重要的數(shù)據(jù)庫上都應(yīng)該建立白名單規(guī)則。
代碼實現(xiàn)的功能非常簡單,就是對用戶輸入的用戶名和密碼的數(shù)據(jù)類型和字符串長度進(jìn)行校驗。如果用戶輸入了不滿足校驗要求的數(shù)據(jù),比如“and1=1”、“'or‘1’=’1’”等常見的登錄SQL注入代碼,就會提示錯誤并拒絕請求。這樣就避免了帶有SQL注入功能的SQL語句被送至數(shù)據(jù)庫服務(wù)器中執(zhí)行,即在數(shù)據(jù)庫服務(wù)器以外就將不合法的輸入拒絕掉。
3.2代碼過濾防御。
SQL注入產(chǎn)生的根本原因是不法用戶修改了程序員預(yù)先設(shè)計好的SQL語句結(jié)構(gòu)。根據(jù)前文的內(nèi)容可以發(fā)現(xiàn),SQL注入語句基本都包含得有各種非法字符串、數(shù)字和符號。如果我們通過編寫特定代碼,將用戶提交的數(shù)據(jù)表單中不合法的內(nèi)容過濾掉,即可有效避免SQL注入攻擊。但是,在過濾的時候必須遵循一定的原則,不能錯將原本合法的SQL語句中的字符也過濾掉,否則將無法實現(xiàn)web應(yīng)用程序的基本功能。比如在所有SQL注入中都存在“空格”符號,但是卻不能簡單粗暴地把用戶提交的數(shù)據(jù)中的空格都過濾掉,因為在英文字符串中,空格本身就是合法輸入的一部分。我們通常的做法是用“{#space}”來替換用戶輸入的空格,在瀏覽器呈現(xiàn)數(shù)據(jù)之前再進(jìn)行反替換。
4.結(jié)束語
本文就數(shù)據(jù)庫安全基本要求、SQL注入的基本原理和防護(hù)手段進(jìn)行了討論。SQL語句作為關(guān)系型數(shù)據(jù)庫的核心執(zhí)行代碼,長期以來都面臨這巨大的網(wǎng)絡(luò)安全挑戰(zhàn),網(wǎng)絡(luò)安全從業(yè)人員必須緊隨時代發(fā)展趨勢和不斷變化的安全需求,不斷推進(jìn)數(shù)據(jù)庫安全性的提升。
參考文獻(xiàn):
[1] HE Guiying, ZHOU jie, WANG lv.Database Security Technology. (2017)321740.
[2] Abraham Silberschatz, Henry F.Korth, S.Sudarshan. Database System Concepts.01-2010-3824.
[3] Ma jun, Duan xinglin. Analysis and prevention of SQL injection in Web application system.1009-2552(2015) 08-0071-0。10.13274 /j. cnki. hdzj.2015.08.019.
[4] Wu Pufeng, Zhang yuqing. An Overview of Database Security. 1000—3428(2006)12—0085—04。TP309.2.2006-6.
(廣安職業(yè)技術(shù)學(xué)院)