摘 要:針對WEB應用安全問題中最常見到的SQL注入攻擊,本文對攻擊的原理、手段和過程做了介紹和剖析,并針對SQL注入的特點指出了對于提高網站安全的策略。
關鍵詞:SQL注入;WEB安全;網站防護措施
引言
近年來,WEB應用成為了人們日常生活、工作、學習中必不可少的工具和信息來源,隨之而來的是信息安全問題層出不窮。2016年國內某專業信息安全平臺被發現存在SQL注入漏洞,導致大量用戶信息被泄露。由于絕大多數當今網站都是通過數據庫存儲用戶信息和網站數據,這導致SQL注入攻擊成為網站最常見到的安全風險來源之一。
1.SQL注入攻擊原理
SQL注入攻擊是通過操作輸入來修改SQL語句,用以達到執行代碼對WEB服務器進行攻擊的方法。簡單的說就是在post/get web表單、輸入域名或頁面請求的查詢字符串中插入SQL命令,最終使web服務器執行惡意命令的過程。可以通過一個例子簡單說明SQL注入攻擊。
假設某網站頁面顯示時URL 為http://www.example.com?test=123,此時URL實際向服務器傳遞了值為123的變量test,這表明當前頁面是對數據庫進行動態查詢的結果。由此,我們可以在URL中插入惡意的SQL語句并進行執行。另外,在網站開發過程中,開發人員使用動態字符串構造SQL語句,用來創建所需的應用,這種情況下SQL語句在程序的執行過程中被動態的構造使用,可以根據不同的條件產生不同的SQL語句,比如需要根據不同的要求來查詢數據庫中的字段。這樣的開發過程其實為SQL注入攻擊留下了很多的可乘之機。
2.SQL注入攻擊常見方法和過程
2.1尋找SQL注入漏洞
確定網站存在SQL注入漏洞的途徑一般有兩種,第一種是可以利用網站的錯誤提示,如果網站開啟了錯誤顯示,攻擊者就可以通過在輸入參數的地方反復調整發送的參數,通過頁面出現的錯誤信息,推測出網站使用的數據庫和開發語言信息。如果網站管理員關閉了錯誤信息提示,攻擊者可以采用盲注的技巧來進行反復嘗試。盲注是利用數據庫查詢的輸入審查漏洞從數據庫提取信息或提取與數據庫查詢相關的信息的技術。如在URL 中輸入login.php?username=admin and 1=1和login.php?username=admin and 1=2,如果前者能正常返回信息,而后者不能,基本上就可以認定網站存在SQL注入漏洞。這是因為1=2的表達式不成立,所以即使username傳入了正確的數值也是無法通過,因此可以判讀出該網站可以通過usernamer參數進行注入。
2.2判斷數據庫
獲得網站的數據庫類型是SQL注入提取重要數據的前提條件之一,可以通過常見的技術架構進行判斷,如aps.net常和SQL Server一起使用,而PHP往往使用MySQL,JSP會配合Oracle或MySLQ。而WEB服務環境也可以提供線索,如運行IIS的服務環境往往采用SQL Server數據庫,使用TOMCAT的更大的可能是MySQL或Oracle。另外,還可以通過詳細的錯誤信息判斷數據庫的版本,比如添加單引號作為注入參數,根據數據庫產生的語法錯誤信息,就可以判斷出數據庫的種類。
2.3攻擊數據庫系統
攻擊數據庫的目的是為了獲得數據庫中有價值的數據信息,進而可以為控制整個WEB系統做鋪墊。獲得數據庫中數據可以遵循層次化的方法,首先提取數據庫的名稱,然后提取表、列,最后才是數據本身。通常,可以通過訪問專門保存表示各種數據庫結構的表,比如MySQL中,這些信息保存在information_schema數據庫中。在該數據庫中的schemata表中存儲著數據庫名,tables表中存儲著表名,columns表中存儲著字段名,通過以上的信息,再獲得數據庫表中的內容就輕而易舉了。
2.4控制WEB系統
在獲得數據庫中數據信息后,可以通過對具有管理權限的賬號信息入手,通過登錄帳號,使用網站后臺上傳功能上傳木馬程序,或添加惡意代碼,最終甚至可以獲得服務器的完全控制權限。
3.SQL注入攻擊防護策略
SQL注入漏洞的產生,都是因為系統要接受來自客戶端輸入的變量或者URL傳遞的參數,為此,開發者一定要遵循“外部數據不可信”原則,對于用戶輸入的內容或傳遞的參數,要時刻保持警惕。因此對于SQL注入的防護策略通常要確保系統傳遞的變量符合開發者的設計要求。
3.1變量檢測
對于數據庫中有固定數據類型的變量,在SQL語句執行前,應該對變量的類型進行嚴格的檢查,確保變量是開發者預想的。比如系統中存在名為id的數字字段,那么系統在執行SQL語句前確保變量id的類型是int型的。
3.2過濾特殊符號
當發生SQL注入攻擊時,攻擊者在提交的SQL語句會包含一些特殊的字符或字符串,如單引號、雙引號、反斜杠、NULL等。這樣,可以通過使用數據庫系統自帶函數或編寫相關驗證程序對用戶輸入的這類符號進行轉義或者過濾,從而達到限制SQL注入的目的。
3.3合理使用預編譯
預編譯是吧一些格式固定的SQL 編譯后,存放在內存池中,當需要執行相同SQL語句時,就可以直接執行以及預編譯的語句,不同的數據庫系統都有預編譯機制。因此,在當遇到類似login.php?username=admin and 1=1的注入攻擊時,預編譯SQL語句 WHERE username=?可以阻止攻擊的成功。
3.4對關鍵數據信息加密
對于數據庫中諸如賬號密碼的信息應該避免使用明文存儲,可以使用AES、RSA、MD5等算法對數據進行加密存儲,這樣即使系統被SQL注入成功,攻擊者也無法輕易獲得關鍵數據信息的內容。
4.結語
SQL注入一直是網站重要的安全風險來源,作為網站的開發者和運維人員應該意識到SQL注入攻擊是一種綜合的攻擊手段。為了避免SQL注入帶來的影響,開發者和運維人員應該從網站設計入手,并對服務器、數據庫管理等多方面加以規范,確保網站可以安全可靠的運行。
參考文獻:
[1]鄭成興.網絡入侵防范的理論與實踐[m].機械工業出版社,2012
[2]黃健.計算機信息安全技術及防護[J].信息安全與技術,2012,4.
[3]陰國富.基于SQL注人的安全防范檢測技術研究[J].河南科學,2009,27
[4]李虎軍.淺談網站SQL注入攻擊防護策略研究[J].電腦知識與技術,2016,3
作者簡介:
鄭智釗,男,1983年出生,工學學士,網絡工程師,工作單位:哈爾濱鐵道職業技術學院,主要研究方向:計算機科學與應用。