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