姜子罡 張一光 藺蜀 梁成崗
SQL注入攻擊分析應用程序的編碼,在發現數據庫的漏洞之后,通過提交SQL的查詢密碼給服務器,得到Web頁面返回的數據,根據這得到的結果,從而利用漏洞獲得數據庫中的重要關鍵性的數據或者相應的權限。而這種注入攻擊的手段通常都是從正常的端口進入,所以防火墻通常不會對其做出有效的反映,只有在事后通過IIS管理日志的分析才能發現。當下很多的中小型的網站主要就是利用托管的方式管理,因而采用分析日志的方式來對SQL注入攻擊進行防范是不太現實的,如果一定要做出防范,需要在程序設計的過程中做出專門的處理。本文主要對SQL注入攻擊進行相關的論述,除了介紹了一些特定的常見的步驟和手段之外,還主要從開發軟件的角度介紹了相應的方法。
1 SQL注入攻擊的手段和步驟介紹
1.1 步驟簡介
通過上面的介紹我們對SQL注入攻擊有了一定的了解,無論在步驟還是手段的方面都有了一個粗略的認識,下面我們來細致的講述下這種攻擊方式的步驟:
a.事先編輯好特殊的SQL語言,然后利用這種語句去尋找注入放面的漏洞;
b.利用發現的注入漏洞來嘗試著進入數據庫,從而有效的獲取數據庫中的關鍵信息;
c.利用上面發現的數據庫中的關鍵信息,通過對其進行仔細的分析,從而獲得管理員的相關權限為sa,為后續的攻擊做好準備。實施直接控制;以SQL Server 2000為例,如果實施注入攻擊的數據庫是SQL Server 2000,且數據庫用戶為sa,則可以直接添加管理員賬號、開放3389遠程終端服務、生成文件等命令。
d.間接進行控制。間接控制主要是指通過SQL注入點不能執行DOS等命令,只能進行數據字段內容的猜測。在Web應用程序中,為了方便用戶的維護,一般都提供了后臺管理功能,其后臺管理驗證用戶和口令都會保存在數據庫中,通過猜測可以獲取這些內容,如果獲取的是明文的口令,則可以通過后臺中的上傳等功能上傳網頁木馬實施控制,如果口令是明文的,則可以通過暴力破解其密碼。
1.2 SQL常用的攻擊手段介紹
SQL注入攻擊漏洞的手段的有很多,下面我們主要介紹幾種常見的:
a.可以在查詢網址的尾部加入“and 1=1”,“and 1=2”等,從而構成查詢的語句,然后通過頁面最終返回的結果判斷是否存在SQL相關的注入漏洞;
b.通過在查詢請求URL尾部添加數據庫中內置變量判斷的語句的方式,然后根據頁面返回的結果來得到關鍵的信息。例如:user就是Server內置的變量,在URL的尾部加上and user>0,那么返回的頁面就可能返回正確的user名稱;
c.在存儲的其間通過調用系統命令的方式在查詢URL的尾部注入。例如:可以在URL的尾部添加:exec master..xp__cmd shell“net user name passwordadd”。這就相當于是利用net的命令新建了一個密碼為password和用戶名為name的帳號。
2 從軟件開發的角度來介紹防范SQL注入攻擊的方法
在設計程序的過程中,需要嚴格對用戶輸入進行合法性的檢查,采用存儲過程對輸入值進行有效的處理,制定合理有效的錯誤返回策略,以及在數據庫設計時對命名的規范都可以有效的防范或者避免SQL注入攻擊Web應用程序。
2.1 SQL注入攻擊一般的防范方法
(1)在服務端正式處理之前對提交數據的合法性進行檢查;(2)封裝客戶端提交信息;(3)替換或刪除敏感字符/字符串;(4)屏蔽出錯信息。(5)不要用字串連接建立SQL查詢,而使用SQL變量,因為變量不是可以執行的腳本;(6)目錄最小化權限設置,給靜態網頁目錄和動態網頁目錄分別設置不同權限,盡量不給寫目錄權限;(7)修改或者去掉Web服務器上默認的一些危險命令,例如ftp、cmd、wscript等,需要時再復制到相應目錄;(8)數據敏感信息非常規加密,通過在程序中對口令等敏感信息加密都是采用md5函數進行加密,即密文=md5(明文),本文推薦在原來的加密的基礎上增加一些非常規的方式,即在md5加密的基礎上附帶一些值,如密文=md5(md5(明文)+123456)。
2.2 檢查用戶輸入的合法性
SQL注入攻擊的手段無非就是通過篡改用戶的關鍵信息,因而我們如果要避免或者防范注入攻擊的話,就必須對特殊的字符,例如;單引號、分號、雙引號、逗號、連接號、冒號等等進行有效的過濾或者轉換,與此同時需要對用戶輸入字符才長度進行有效的限制。另外利用存儲過程的方式對輸入值進行處理,通過存儲過程可以將查詢的URL輸入值進行參數化,而數據庫的服務器可以有效的避免將參數的內容作為SQL的指令進行處理,只有在數據庫對SQL的指令完成編譯之后,才會套用參數進行運行,這樣可以有效的避免SQL注入攻擊的風險。
2.3 制定合理有效的錯誤返回策略
由于SQL的錯誤反饋信息可以有效的透露數據庫設計的某些細節,因而需要注意的就是當應用程序發生錯誤的時候,盡量不要將錯誤的信息全部反饋給用戶,通常情況下正確而有效的做法就是對發生錯誤的頁面進行一定的包裝,根據用戶的權限來向用戶展示錯誤的信息,如果沒有管理員的權限,可以僅僅提示是SQL發生了錯誤的運行。
2.4 在數據庫設計的過程中要注意規范化命名
軟件工程師或者數據庫的編譯者在對數據庫進行設計時,應該避免利用日常詞匯對數據庫的字段和表進行任意的命名,例如:name,systeminfo,password,useld,account等等,SQL注入攻擊通常就會對這些關鍵的詞匯進行尋找,通過發現其是否存在,然后發現尋找相應的漏洞。因而在數據庫設計的時候一定要遵循相應的設計原則,適當的增加字段和表的前后綴,使得命名更加的合理。
3 總論
由于Web的應用程序開發的門檻比較低,所以有很多的初學者尚未對整體的知識進行了解就盲目的開發程序,或者一部分的程序設計人員、軟件工程師即使擁有了很豐富的設計知識,但是頭腦中對網絡安全的概念和設計經驗的匱乏,使得他們開發設計出的軟件有很多的安全隱患,一旦受到SQL的注入攻擊就無力招架,甚至癱瘓,因而我們需要做的就是在日常的數據或者程序開發過程中主動進行防范,這樣不僅可以提升自身的安全意識,也可以增強網站的安全系數,保證網站安全而有效的運行。
參考文獻
[1] 李元鵬.SQL注入攻擊掃描分析工具的實現與攻擊防范技術研究[D].北京交通大學,2010.
[2] 李小花.基于程序分析的SQL注入防御系統的設計與實現[D].湖南大學,2010.