史旭寧 姜楠 蔣青山



摘要:隨著數據庫技術和網絡技術的迅速成長,數據庫已經應用到各行各業,同時,數據的安全問題也隨之推上浪尖。本文將從應用的角度出發,論述了SQL Server安全措施;同時,本文對SQL注入式攻擊的原理、步驟、危害進行必要講解,并著重闡述對SQL注入式攻擊的防范措施。
關鍵詞:數據庫安全;SQL注入;身份認證;數據加密;字符規范
中圖分類號:TP311? ? ? 文獻標識碼:A
文章編號:1009-3044(2021)09-0025-02
開放科學(資源服務)標識碼(OSID):
1 緒論
隨著數據庫和網絡技術的迅速成長,數據庫已經應用到各行各業,所謂的“模式”也隨之發生變化,就當下而言,最為主流的模式便是Web前臺加后臺服務器的模式。后臺服務器最核心的部分當屬后臺數據庫,故一個服務器的Web服務器是否安全,很大程度上取決于Web端的安全控制,以及數據庫的安全檢測與防護。盡管開發者早已認識到這一點,但數據庫攻擊的案例卻屢見不鮮:從互聯網剛興起時雅虎的數據泄漏,到2011年CSDN的用戶信息被盜,再到“12306”的數據泄漏等等。這一切都在告訴我們:web服務器的安全還是要不斷提升。
2 數據庫的安全機制
數據庫的安全機制一般需要滿足三方面要求:首先,需要滿足數據庫、數據語義、操作等方面的完整性;其次,數據庫授權了用戶才能獲得數據、并且對用戶的行為進行記錄,審計;再次, 數據庫授權用戶對數據獲取和各種操作[1]。此安全機制包含以下6項內容:
2.1身份認證
身份認證是數據庫管理系統提供的第一道保護屏障,這個證明形式不是唯一的,有著多樣性,比如動態口令鑒別,靜態口令鑒別,數字證書鑒別, 生物特征鑒別,智能卡識別等。
2.2訪問控制
訪問控制是數據庫安全中的核心技術,主要指訪問主體對訪問客體權限的定義,并將其登記到數據字典中進行合法權限的檢查,主要有登錄權限、確定訪問權限以及操作權限3個部分[2]。
2.3系統文件
作為數據庫系統的運行平臺,操作系統(OS)為數據庫系統提供著安全保護,相反,因為數據庫以文件的形式存在于操作系統中,而且操作系統自身的安全配置和漏洞也會引發不安全事件,入侵者也會因為OS的原因竊取或篡改數據庫文件和數據,所以,使用安全性高一些的系統,對OS進行安全配置和系統修補,加強OS的安全管理,對其用戶管理和權限進行合理分配,也是數據庫管理系統安全機制管理手段之一[3]。
2.4數據庫加密
數據庫的加密包含加密保護存儲的敏感數據,以及加密保護傳輸過程來控制非法訪問,從而數據庫的加密包含加密保護存儲的敏感數據,以及加密保護傳輸過程來控制非法訪問[4],加密過程首先是將明文數據通過使用加密技術加密成密文數據,查詢時,進行逆向操作,又將密文數據去掉解密,還原成明文數據,這樣即便硬盤丟失也不會擔心泄密,當然成本也隨之提高。
2.5數據庫審計
數據庫審計包括實時監控數據庫,記錄各類操作行為的機制,數據庫審計能夠跟蹤、定位, 及時發現數據庫系統的異常使用,阻斷各類違規操作,總之,管理人員可以通過數據庫審計得到有效的預警機制和行為記錄。
2.6.備份和恢復
任何一個數據庫系統總是避免不了會發生故障,所以,定期對數據庫進行備份是非常必要的,為了提高數據恢復的概率,可以將數據保存在多個存儲設備中,并將最初的數據文件進行備份。
3 SQL注入式攻擊
SQL注入式攻擊,簡單地說就是利用程序漏洞,繞過程序的權限,將SQL命令插入到頁面請求的查詢字符串或者輸入域進行攻擊,結果是輕則獲得敏感信息和數據,重則控制服務器。
圖1是典型的SQL注入式攻擊圖:
3.1攻擊原理
SQL注入式攻擊有直接攻擊法和間接攻擊法兩種,前者是直接將代碼插入到用戶輸入變量,該變量與SQL命令串聯在一起,故稱之為直接攻擊法;后者是將惡意代碼注入字符串中,該字符串存于表中并連接動態SQL命令來執行惡意SQL代碼[5]。
下面將再現一個最簡單的登錄頁面 login.asp ,源代碼如圖2所示:
登錄驗證腳本checkuser.asp如圖3所示:
此 Web 網站用戶欄若輸入sysop'and 1=1--,則在 checkuser.asp 中, “--”為注釋語句。SQL 語句中已經正確放入輸入的 SQL 條件并執行,最終獲取到自己想要的各種信息。
3.2 攻擊步驟
3.2.1 SQL注入漏洞的判斷
首先,定期查看IIS日志中的文件信息,如果IIS中的日志數量持續增加,就有SQL注入攻擊的可能;其次,如果數據庫出現一些含有大量外來信息的臨時的表格,而且這些表格與我們平時的表格有不同的結構,這也是受到SQL注入攻擊的一種現象;最后,可以依據檢驗用戶輸入的數據等信息進行判斷。
檢測注入漏洞最簡單的方法是在用戶輸入變量的時候,輸用一個單引號" ' ",比如在登錄時,用戶名填為:1',因為這個額外的單引號,有缺陷的代碼就會結束當前的語句,并返回一個提示報錯的頁面或是數據庫錯誤的提示,即說明存在SQL注入漏洞。
SQL注入漏洞通常存在于:
(1) Web表單輸入域;
(2) UOL的一部分SQL查詢中;
(3) 存儲在緩存中的參數,并且這些參數要回傳給服務器;
(4) 頁面的隱藏字段。
3.2.2收集信息
在SQL進一步的攻擊之前,會收集提示的數據庫報錯信息、了解目標系統的輸出機制,判斷數據庫類型、了解SQL語句、表名、字段名以及查詢方式,用戶的權限以及數據庫和操作系統的交互程度是非常有必要的,然后根據SQL注入漏洞與數據表名、字段名等對數據庫進行攻擊[6]。
3.2.3提取數據
使用“having 1=1”語句枚舉一個表的所有列來獲得數據庫的結構,獲取了數據庫結構便容易讀出表中數據,如圖4所示:
3.2.4與OS交互的兩種方式
(1)執行系統命令;
(2)攻擊者可以通過讀取、配置系統文件來執行命令;
3.2.5擴大影響
以攻破的主機作為主陣地,為了擴大攻擊范圍,使用“select * from sysservers” 在 MS SQL Server 中可查詢網絡中的其他主機,然后使用 OPENROWSET 命令入侵其他主機事輕而易舉的事情。
4 數據庫安全防范措施
4.1服務器安全配置
服務器的安全設置可以參見第一章的內容。主要從身份認證、訪問控制、數據庫加密、數據庫審計和備份、恢復等方面考慮。
4.2數據加密
對數據的加密主要是防止物理性攻擊。在登錄服務器時可以使用Windows和SQL身份認證混合模式,且將登錄名稱、密碼等數據加密保存。鑒于有些存儲過程很容易被利用,將不必要的存儲過程刪除, 也是一個防范的措施。
4.3數據過濾和字符規范
4.3.1對于動態構造SQL查詢的場合,可用以下方法
(1)限制查詢數據庫賬戶權限。使用不同賬戶執行Query、INSERT、UPDATE或DELETE命令等操作。
(2)替換單引號,為了防止攻擊者修改 SQL 命令的含義,也就是說,把所有單獨出現的一個單引號換成兩個單引號。
(3)避免輸入或者直接刪除連字符,原因是此類查詢的后面已被注釋,攻擊者只需要取得合法用戶名,就可以輕松獲得訪問權限。
4.3.2 使用存儲過程來執行所有的查詢,數據庫的權限只容許在一定的存儲過程中執行
限制用戶可以輸入的字符長度。那么大于這個長度就不被認可,這將極大增加數據庫安全系數。
保障合法數據。在服務器端和客戶端分別進行數據檢查,保障輸入內容只包含合法數據。
使用參數化語句并盡可能使用SQL Server數據庫自帶的安全參數,數據庫工程師在開發產品時要盡量采用參數化語句,通過參數來傳遞這個變量,因為輸入的變量不是直接嵌入到SQL語句,這種方法可以提升設定執行計劃能夠使用的固定次數,降低了數據庫的工作壓力,提高了運行效率,對防范SQL注入攻擊起到了重要作用,同時也保護了用戶的隱私和安全[7]。
5結束語
在互聯網高速發展的背景下, SQL注入已顯然成為B/S系統一個很嚴重的安全問題。本文對數據庫的安全機制,SQL注入式攻擊原理、攻擊方式、類型做了詳細闡述,同時重點分析了如何有效防范SQL注入式攻擊,關于如何防范還有待進一步研究探索。
參考文獻:
[1] 袁玫,林志英,劉勁松.網絡數據庫應用教程[M].北京:人民郵電出版社,2003:13.
[2] 薛玉芳,李潔瓊,李亞軍.數據庫安全與防護性的技術研究[J].中國新技術新產品,2011(3):20.
[3] 劉雪梅.基于SQL Server數據庫的安全性對策探究[J].電腦編程技巧與維護,2019(9):96-98.
[4] 劉博.數據庫加密技術在WEB平臺的研究與應用[D].西安:西安電子科技大學,2007.
[5] 牛方華,楊大哲,劉瑞芳.電力信息系統結構化查詢語言注入攻擊原理及安全防護[J].山西電力,2014(4):38-40.
[6] 徐嘉銘.SQL注入攻擊原理及在數據庫安全中的應用[J].電腦編程技巧與維護,2009(18):104-106.
[7] 于雷.SQL數據庫注入攻擊的Java Web防御對策[J].電腦迷,2017(22):27.
【通聯編輯:光文玲】