SQL注入的定義網上不少,做爲一個初學者,我對SQL注入的理解是這樣的:網站應用通常都有後臺數據庫(不管是關係型仍是非關係型),用戶在網站上的絕大部分操做,最終都會跟數據庫交互(也就是執行一串SQL語句)。既然最終是執行一串SQL語句,那攻擊者只要猜到了這串SQL語句從前端輸入到最後執行是如何拼接的,就能夠拼接本身的惡意SQL語句,來非法獲取數據。因此,要學習SQL注入,首先,你得會SQL~O(∩_∩)O~前端
我用DVWA來練習SQL注入,先將安全等級設置爲low,以下:sql
進入SQL Injection頁面,以下。做爲一個初學者,剛進入這個頁面的時候,我是懵逼的...>_<...數據庫
頁面就一個輸入框和一個按鈕,看上去是須要輸入一個數字,我嘗試輸入了數字2,頁面返回了一些信息,同時URL後面多了"?id=2&Submit=Submit#":安全
從這裏看出,參數名稱爲id,參數值爲數字。從返回的信息來看,應該是查詢了數據庫用戶表裏用戶id爲2的那條數據的其中兩個字段,因此最終執行的sql應該相似:服務器
select Firstname,Surname from user表 where id =2post
既然參數是從前端傳進去的,那麼有可能在拼接參數的過程當中還會帶有引號,所以輸入2',而後進入了報錯頁面:學習
從報錯能夠看出,後臺使用的數據庫類型是MySQL,傳入id的值時使用了單引號(能夠再試試輸入雙引號,不會報錯),因此最終執行的sql應該是:網站
select Firstname,Surname from user表 where id ='2'3d
而後嘗試輸入:2' or '1'='1,對應sql以下:blog
select Firstname,Surname from user表 where id ='2' or '1'='1'
經過1=1將where的過濾條件變爲真,結果返回了用戶表中全部行,注入成功。
怎樣纔算SQL注入成功了呢?我的理解是:只要違背了程序本來的意願都算攻擊成功,好比:拿到了更多數據,越權拿到數據,拿到敏感數據,拿到對方服務器信息等等。該頁面的本意是根據id一次拿一行數據,經過sql拼接我拿到了表中的全部行。
一點點感悟:
1. 進行異常和錯誤信息處理很重要,不能直接將數據庫異常/錯誤拋出去
2. 避免將重要參數暴露在URL中,可使用post請求,將參數放在body中傳輸
如需轉載,請註明出處,這是對他人勞動成果的尊重~