肖孝楠 伍岳 王雪梅



[摘要]“沒有網絡安全就沒有國家安全”,網絡安全的核心是保護網絡可共享資源的安全。SQL注入攻擊是最常見的一種網絡安全問題,被OWASP列為“十大Web應用系統安全威脅之首”。以DVWA滲透測試平臺,以PHP+Mysql環境為例,介紹SQL注入攻擊的過程和基本原理,最后給出安全防范措施,為防御SQL注入攻擊提供一些方法和手段。雖以PHP環境為例,但對其他編程語言開發的Web程序也有借鑒意義。
[關鍵詞]網絡安全;Web安全;SQL注入;防范措施
[中圖分類號]TP393
[文獻標志碼]A
[文章編號]2096-0603(2019)07-0036-02
在“互聯網+”時代,越來越多的服務在網上完成,越來越多的系統是基于互聯網的Web系統,而其中絕大多數系統需要后臺數據庫支持,數據庫中數據的安全問題則成為重點關注的問題。SQL注入是最常見的一種數據庫安全漏洞,被0WASP(開放式Web應用程序安全項目)列為“十大Web應用系統安全威脅之首”。
一、SQL注入基本原理
(一)SQL注入攻擊的定義
結構化查詢語言簡稱SQL語言,是一種專門用于關系型數據庫的編程語言。SQL注入攻擊主要有兩種形式,一種是將惡意代碼嵌入在正常的SQL語句中,傳遞到后臺數據庫服務器執行,這種攻擊被稱為“直接攻擊”或“一階SQL注入”。另一種是事先將惡意代碼保存到數據庫,在攻擊者第二次請求時響應并攻擊數據庫,這種攻擊稱為“間接攻擊”或“二階SQL注入”。SQL注入具有如下的特性:
(1)廣泛性:任何一個基于SQL語言的數據庫都可能被攻擊,很多開發人員在編寫Web應用程序時未對從輸入參數、Web表單、cookie等接受到的值進行規范性驗證和檢測,通常會出現SQL注入漏洞。
(2)隱蔽性:SQL注入語句一般都嵌人在普通的HTTP請求中,很難與正常語句區分開,所以當前許多防火墻都無法識別予以警告,而且SQL注入變種極多,攻擊者可以調整攻擊的參數,所以使用傳統的方法防御SQL注入效果非常不理想。
(3)危害大:攻擊者通過SQL注入獲取到服務器的庫名、表名、字段名,從而獲取到整個服務器中的數據,對網站用戶的數據安全有極大的威脅。攻擊者也可以通過獲取到的數據,得到后臺管理員的密碼,然后對網頁頁面進行惡意篡改。這樣不僅對數據庫信息安全造成嚴重威脅,對整個數據庫系統安全也影響重大。
(4)操作方便:互聯網上有很多SQL注入工具,簡單易學,攻擊過程簡單,不需要專業知識也能自如運用。
(二)案例演示
下面使用DVWA(Damn Vulnerable W eb Application)演示SQL注入過程,系統環境為PHP+Mysql。
1.正常輸入
我們先進行一次正常查詢,在BH框中輸入1,預期顯示BH為1的用戶信息,如圖1所示。查看源碼為:$querySQL=“select*from tab_user where bh={$bh}”,構造語句為:“select * from tab_userwherebh=1”。這是正常輸入,輸出的結果與預期相符。
2.獲取查詢結果列數
SQL語句中加入order by子句,可以檢測查詢結果中包含多少列。如圖2所示,輸入:“1 or3=3 order by 1 #”,此語句where查詢條件中邏輯或一個3=3的恒等式,所以不管表中是否有BH為1的用戶,都能夠查詢成功。繼續輸入“1 or 3=3 order by 2#”,“1or3=3orderby3#”,按照第一二列和第三列排序,語句執行正常,說明查詢結果中至少包含三列;輸入“1 or 3=3 order by 4#”,語句執行失敗,說明結果列的數量只有三列。
3.獲取當前數據庫
輸入“1 union select 2,2,database()#”,其中database()函數可以返回當前數據庫名,輸出結果如圖3所示,可以看到當前數據庫為“injection。
4.獲取數據庫中的表
輸入:“1 union select 2,2,group_concat(table_name)frominformation_schema.tables where table_schema=database()#”,提交后屏幕上顯示當前數據庫中有兩個表,表名為tab_user和test。
5.獲取表中字段
輸入:“1 union select 2,2,group_concat(column_name)frominformation_schema.columns where table_name=‘tab_user #”,提交后在看到tab_user表包含的三列,分別為bh,name,password。
6.獲取表中數據
輸入:“1 union select 2,group_concat(BH,name),group_concat(password)from tab_user #”,即可以查詢出tab_user表中的用戶名和密碼這些重要數據,結果如圖4所示。
二SQL注入防范措施
SQL注入攻擊方式很多,在這個案例中我們使用簡單的SQL注入攻擊手段輕松獲得數據庫中未授權的信息,可見SQL注入攻擊危害極大。如何防止或減輕SQL注入攻擊?當然“防患于未然是最好的策略,下面從多個角度介紹一些SQL注入攻擊的防范措施。
(一)數據庫服務器端防范措施
1.數據庫服務器做好加固,安裝防火墻,及時打補丁,使用最低權限賬號運行數據庫。
2.修改一些數據庫端默認配置,比如oracle數據庫中數據庫鏈能夠被遠程訪問,應該將其從普通賬戶中移除。
3.刪除系統安裝時的默認賬戶,重新創建賬戶,根據應用定制賬戶,每個賬戶只授予最小權限。
4.隔離用戶登錄,將查詢權限與增、刪、改權限分別用不同的賬戶來實現,使每個登錄權限僅僅具有其功能所必需的數據庫訪問權限。
5.撤銷public權限,不使用“grant…to public”語句進行授權,精確授權。
6.刪除危險的系統存儲過程、函數,比如SQL SERVER中的xp_cmdshell、sp_configure 等。
7.使用數據庫端編程,自定義存儲過程或自定義函數,并且給某些用戶只授予execute權限,前端程序只能通過調用存儲過程或者函數來訪問數據庫。
8.對傳入存儲過程的參數進行有效性驗證,避免數據成為SQL控制流的一部分。
9.口令等敏感數據不能直接存儲在數據庫中,最好是存儲口令的加鹽哈希。其他關鍵數據也都使用強加密技術進行存儲。
10.避免明顯的對象名。比如表中存密碼的列名定義為password,pwd,pass等,這是個安全隱患。
(二)Web服務器端防范措施
1.安裝Web應用防火墻,關閉不需要的端口和權限,設置安全目錄保護重要文件。
2.使用獨立的主機做服務器,避免與數據庫服務器部署在同一臺主機上。
3.提高Web日志詳細程度,定期查看日志。
4.使用空的默認Web站點,查詢請求未找到匹配值,則默認跳轉到該站點。
(三)Web前端程序防范措施
1.驗證每一個輸入值,對用戶請求的數據進行過濾。
2.封裝輸入校驗類,對輸入項校驗通過后,再用于構造動態SQL語句。
3.使用預編譯的SQL語句綁定變量,使攻擊者無法改變SQL語句的結構。如:
$stmt=$conn?prepare(“INSERT INTO MyUsers(XM,id,adr)VALUES(?,?,?)”);
$stmt?bind_param(“qaz”,$id,$adr)。
4.使用參數化語句,避免在前端構造動態SQL。
5.檢查數據類型。
6.隱藏不必要的錯誤信息。
7.輸入的內容用其他控件產生,比如密碼通過軟鍵盤輸入,動態寫人頁面。
三、結語
SQL注入是一種常見的攻擊手段,危害極大。本文通過案例演示介紹SQL注入攻擊的過程,并總結了常用的防范措施,有助于一定程度上減輕SQL注入的危害,具有一定的應用價值。
隨著技術的發展,SQL注入的漏洞也在更新,SQL注入攻擊技術也在發展,它的隱蔽性和攻擊性更強。所以隨著新技術的不斷出現,SQL注入漏洞的研究也要不斷深入。
參考文獻:
[1]黃芳,蘇桂蓮.Web應用中SQL注入攻擊與防范探析[J].軟件導刊,2012,1(11):137-138.
[2]唐林.數據庫SQL注入技術及其防護[J].湖北函授大學學報,2014(10):104-105.
[3]吳宗卓.SQL注入防御技術研究與實現[J]電子測試,2015(21):81-82.