安全測試之SQL注入攻擊
一、SQL注入攻擊的概念
首先說一下,攻擊者之所以可以利用自己輸入的資料來達到攻擊網站的目的,原因就在於SQL語言作為一種解釋型語言,它的資料其實是由程式設計師編寫的程式碼和使用者提交的資料共同組成的。正是這個原因,攻擊者可以構造對自己有利的資料,利用網站的一些SQL漏洞來達到惡意的目的。
SQL注入,就是指攻擊者將惡意的字串或者語句等資訊作為引數輸入,伺服器在驗證這個欄位的時候,讀取攻擊者輸入的資料,將其作為正常的值參與SQL語句的查詢,試想,如果攻擊者輸入了一個字串,在SQL語句執行之後,可以導致刪除表等操作,對於一個應用來說,影響是很大的。
二、SQL注入攻擊的一個簡單例項
某網站的登入功能,使用者登入頁面需要填寫使用者名稱和密碼,假設如果其中一個使用者名稱和密碼是admin和123456,當用戶輸入在相應的表單中輸入正確的使用者名稱和密碼之後,此應用的相應函式執行一定的驗證(驗證使用者名稱和密碼是否匹配),伺服器執行SQL語句(表名是user):select * from user where username=’username’ and pwd=’password’,邏輯是如果這個查詢語句返回結果不為0,則認為是驗證通過,即可以登入成功的使用者。
如果某使用者輸入admin和123456,即執行語句:select * from user where username=’admin’ and pwd=’123456’,執行結果不為0,所以使用者登入成功。
如果一個使用者輸入test’ or 1=’1和111111,即執行語句:select * from user where username=’test’ or 1=’1’ and pwd=’111111’,因為此查詢語句中1=’1’的結果為1,or 1=’1’使查詢條件始終返回1,因此此語句的查詢結果不為0,這樣,此使用者沒有使用正確的使用者名稱和密碼也可以登入成功,這就是SQL注入的一個簡單例項。
三、SQL注入的後果
SQL注入攻擊的危害性還是比較嚴重的,對於一個有經驗的SQL注入攻擊者,如果網站存在SQL注入的漏洞,攻擊者利用一些惡意的字串可以進行一些表格的查詢甚至更改和刪除,也就是說,這個安全漏洞會把資料表及其結構顯示在攻擊者的面前,攻擊者甚至可以利用一些手段來進行其他更嚴重的攻擊等。
四、SQL注入一般會出現在哪些地方?
1、含有輸入資料表單的頁面(登入介面、查詢介面、反饋介面等),即使是hidden的表單也有可能存在這個問題。
五、SQL注入的防範措施
1、從開發者的角度來說,防範措施如下:
(1) 轉義敏感字元及字串
SQL的敏感字元包括:
“exec”, “xp_”, “sp_”, “declare”, “cmd”, “Union”, “+”, “//”, ”..”, “;”, “’”, “–”, “%”, “0x”, “><=!-*/()|” ,和空格。
(2) 遮蔽出錯資訊:阻止攻擊者知道攻擊的結果
(3) 在服務端正式處理之前提交資料的合法性(合法性檢查主要包括三 項:資料型別,資料長度,敏感字元的校驗)進行檢查等。最根本的解決手段,在確認客 戶端的輸入合法之前,服務端拒絕進行關鍵性的處理操作.
2、從測試人員的角度來說,防範措施是:
在程式開發前(即需求階段),我們就應該有意識的將安全性檢查應用到需求測試中,例如對一個表單需求進行檢查時,我們一般檢驗以下幾項安全性問題:需求中應說明表單中某一field的型別,長度,以及取值範圍(主要作用就是禁止輸入敏感字元);需求中應說明如果超出表單規定的型別,長度,以及取值範圍的,應用程式應給出不包含任何程式碼或資料庫資訊的錯誤提示等。