雷蕾
摘 要:隨著科技的進步,計算機技術發展迅速,愈來愈多的系統、平臺、軟件在存儲相應數據之時使用數據庫,使用數據庫便會用到SQL語言,文章分析說明了什么是SQL注入,SQL注入的特點原理,討論了常見的一些SQL注入方法,根據不同的方法給出防范SQL注入相應的技術措施。
關鍵詞:SQL注入的分類;SQL注入攻擊;SQL注入防范;
1. SQL注入產生的原因
SQL注入攻擊是因為編程人員在編寫 SQL語句時,不能正確地寫出 SQL語句,也不能對特定的字符進行篩選,從而使客戶端能夠在全局變量 POST和 GET的基礎上,實現對 SQL的遠程訪問。SQL注入語言是屬于拼接式的語言,尤其其查詢條件字符串也可以拼接而成,注入者違反程序設計者的初衷,拼接了合法的和非法的查詢條件,形成含有 SQL 注入的 SQL 語句[1]。
2. SQL注入攻擊原理
很多系統、平臺、軟件使用數據庫來存儲數據信息,而SQL語句命令是連接前端web端和后端數據庫之間的一個接口,都需要使用SQL語句來查詢數據的存儲情況、位置等,從而返回用戶需要查找的信息。因為開發人員的編程水平參差不齊,在程序設計中沒有對某些字符進行正確性的審查和篩選,從而使攻擊者在 URL連接、表單域中輸入SQL指令,從而發現了數據庫中的敏感信息,從而形成 SQL注入攻擊。
3. SQL注入攻擊實例
(1)我們首先需要尋找注入點,先在url參數后添加單引號觀察回顯,加單引號會導致SQL語句執行錯誤,當前頁面可能會報錯或者出現查詢內容不回顯的情況比較經典的“1=1”、“1=2”測試法。
(2)若是已經需找到了注入點,http://xxx.xxx.xxx/yes?id=xx后面追加“and 1=1并訪問該網址即http://xxx.xxx.xxx/yes?id=xx and 1=1應該與訪問原地址得到的結果相同。在http://xxx.xxx.xxx/abcd.asp?p=xx后面追加“and 1=2并訪問該網址即http://xxx.xxx.xxx/abcd.asp?p=xx and l=2應該與訪問原地址得到的結果不同,且提示數據庫錯誤。這就說明網址存在SQL注入漏洞。
(3)通過在url后構造一些特殊的SQL語句在數據庫中查找我們所需要知道的信息,如表名、用戶名、列名、數據庫名、密碼等信息。
4. SQL注入的分類
(1)數字型注入:當輸入的參數為整型時,如id、年齡等,如果存在注入漏洞,則可以認為是數字型注入。對于Java、C#這類強類型語言,如果試圖把一個字符串轉換為int類型,則會拋出異常,無法繼續執行。所以,強類型的語言很少存在數字型注入漏洞,絕大多數存在于弱類型語言。
(2)字符型注入:如果是參數是字符串時被稱作字型。數字型和字型注入的最大不同是:數字型不要求單引號封閉,而通常采用單引號封閉。
(3)報錯注入:報錯注入使用的是在數據庫的錯誤信息會返回顯示在網頁上,我們需要構造一些語句使得數據庫產生報錯信息返回至網頁上。
(4)布爾盲注:布爾型盲注就是在頁面沒有錯誤顯示時進行注入攻擊,我們需要對語句進行構造且讓頁面呈現出兩種不同的狀態,分別是TRUE和FALSE,可以根據這兩種狀態判斷我們輸入語句是否查詢成功。
(5)時間盲注:時間盲注也叫做延時注入,在既沒有回顯顯示數據庫反饋的內容,又沒有顯示報錯信息,也沒有布爾型狀態時,我們可以選擇延時注入。這里需要用到一個 MySQL 的 sleep(n)函數,功能是休眠 n 秒,sleep()函數執行是有條件的,必須保障 SQL 語句執行結果存在數據記錄,才會停止指定的秒數,如果 SQL 語句查詢結果為空,那么 sleep函數不會停止[1]。
(6)寬字節注入:寬字節注入準確來說不是注入手法,它是一種較為特殊的注入情況,在我們測試?Id=1’時會發現單引號并沒有被帶入進去,而是被轉義處理了,轉義后的單引號不再具有作用,變成了輸入的內容,要想成功注入就需要對這個轉義進行處理。
5. SQL注入的方法
在系統開發后期需要進行SQL注入攻擊測試。SQL注入攻擊測試通常分為手工測試和自動測試。下面分別介紹一下這兩種測試方法[2]:
(1)手動測試
手動測試SQL注入是確定數據庫中是否存在SQL漏洞的一種常見方式。測試人員可以通過檢查返回的錯誤信息和嘗試猜測數據庫的結構來查看漏洞。手工測試比較直觀,但由于分析返回的錯誤信息和嘗試猜測數據庫的結構比較繁瑣且需要的時間和精力較多,而且并不是所有的SQL注入漏洞都能夠被發現。
(2)自動測試
如果是大型或者復雜的系統,人工測試無法確保能夠檢測出 SQL注入點或是是否存在SQL注入;這時,我們可以以“黑客”方式,利用這些工具,對相應的系統進行 SQL注入,從而發現從外部可以攻破的漏洞,因此可以修改程式的參數和程式碼,這樣被稱作是自動化檢測。自動化檢測是使用一些工具的,例如最常用到的SQLmap,它是可以自動檢測并且可以利用SQL注入漏洞直接獲取數據庫的相關信息,包括訪問底層文件系統、數據庫指紋識別等。
6. 對SQL注入的防范
盡管對系統安全費盡心思,裝補丁、安防火墻、裝殺毒軟件,但防火墻與殺毒軟件對注入是沒辦法防范的,因為注入入侵跟普通的頁面訪問沒什么區別[3]。主要的SQL注入防范方法有:
(1)分級管理
權限等級管理,權限管理嚴格,一般用戶不得給予建立、刪除、修改等相關權限,僅由管理員擁有增刪改查的權限。
(2)二次過濾
為了保證數據的安全,SQL注入要對輸入和提交的變量進行轉換、過濾和篩選,以避免SQL注入,尤其是單引號、雙引號等字符,然后,依據程序的功能和用戶的輸入進行二次篩選,保證了系統的安全。
(3)參數傳值
編程人員在編寫 SQL時,不能直接向 SQL中寫入變量,而要將相關的變量設定為參數。這樣就可以阻止 SQL的插入。在此基礎上,對輸入的信息進行篩選,篩選出不可靠的信息?;蚴褂脜祩髦档姆椒▉韨鬏斴斎胱兞?,從而最大限度地防止 SQL注入的入侵。
7.總結
SQL注入攻擊作為當前Web應用安全熱點之一,從1998 年第一次出現至今,已有10年發展歷史,被廣為利用并持續發展[4]。要想有效的防護SQL注入攻擊,需要采用系統、綜合的方式來解決,需要每個人一起共同努力。
參考文獻
[1] 翟寶峰. SQL注入攻擊的分析與防范[J]. 遼寧工業大學學報(自然科學版),2021,41(3):141-143,147. DOI:10.15916/j.issn1674-3261.2021.03.001.
[2] 徐鑫濤. 淺析SQL注入攻擊[J]. 中國科技信息,2007(1):97,99. DOI:10.3969/j.issn.1001-8972.2007.01.048.
[3] 遲國棟,錢英軍,姚麗麗. SQL注入攻擊與防范[J]. 世紀橋,2007(3):72-73. DOI:10.3969/j.issn.1001-0475.2007.03.032.