**SQL全稱是Structured Query Language**
是一種結構化的查詢語言,用於與數據庫進行交互並能夠被數據庫解析。SQL注入攻擊是一種常見的注入攻擊類型。攻擊方式在用戶與程序進行交互時發生的。如在表單輸入、搜索框輸入功能中插入SQL命令,然後發送到服務端。服務端對數據進行了解析執行,並執行了一些非預期的操作。
**按照注入點類型來分類**
**(1)數字型注入點**
在 Web 端大概是 `http://xxx.com/news.php?id=1` 這種形式,其注入點 `id` 類型爲`數字`,所以叫數字型注入點。
這一類的 SQL 語句原型大概爲 `select * from 表名 where id=1`。
組合出來的sql注入語句爲:`select * from news where id=1 and 1=1`
> eg:http://www.xxx.com/news.php?id=1===>http://www.xxx.com/news.php?id=1 and 1=1
**(2)字符型注入點**
在 Web 端大概是 `http://xxx.com/news.php?name=admin` 這種形式,其注入點 `name` 類型爲`字符類型`,所以叫字符型注入點。
這一類的 SQL 語句原型大概爲 `select * from 表名 where name='admin'`注意多了引號。
組合出來的sql注入語句爲:`select * from news where chr='admin' and 1=1 ' '`閉合單引號
chr='admin' union select 1,2,3,4 and '1'='1 ====> chr='admin'(閉合前面單引號) union select 1,2,3,4 and '1'='1'
判斷字符型漏洞的 SQL 注入點:
① 還是先輸入單引號 `admin'` 來測試
SQL 語句就會變爲:`SELECT * FROM table WHERE username = 'admin''`
頁面異常。
② 輸入:`admin' and 1 = 1 --`
注意:在 admin 後有一個單引號 ',用於字符串閉合,最後還有一個註釋符 --
SQL 語句變爲:`SELECT * FROM table WHERE username = 'admin' and 1 = 1 --`
頁面顯示正確。
③ 輸入:`admin' and 1 = 2 --`
SQL 語句變爲:`SELECT * FROM table WHERE username = 'admin' and 1 = 2 --`
頁面錯誤。
滿足上面三個步驟則有可能存在字符型 SQL 注入。
> eg:http://www.xxx.com/news.php?name=admin ===>http://www.xxx.com/news.php?name='admin' and 1=1 ' '
**(3)搜索型注入點**
這是一類特殊的注入類型。這類注入主要是指在進行數據搜索時沒過濾搜索參數,一般在鏈接地址中有`“keyword=關鍵字”`,有的不顯示在的鏈接地址裏面,而是直接通過搜索框表單提交。此類注入點提交的 SQL 語句,其原形大致爲:`select * from 表名 where 字段 like '%關鍵字%'。`
組合出來的sql注入語句爲:`select * from news where search like '%關鍵字%' and '%1%'='%1%'`
測試可以用`%' union select 1,2,3,4 and '%'='`這個語句
> eg: http://www.xxx.com/keyword=xxx`====>http://www.xxx.com/keyword=xxx%' union select 1,2,3,4 and '%'='
**按照數據提交的方式來分類**
**(1)GET 注入**
提交數據的方式是 GET , 注入點的位置在 GET 參數部分。比如有這樣的一個鏈接http://xxx.com/news.php?id=1 , id 是注入點。
**(2)POST 注入**
使用 POST 方式提交數據,注入點位置在 POST 數據部分,常發生在表單中。
**(3)Cookie 注入**
HTTP 請求的時候會帶上客戶端的 Cookie, 注入點存在 Cookie 當中的某個字段中。
**(4)HTTP 頭部注入**
注入點在 HTTP 請求頭部的某個字段中。比如存在 User-Agent 字段中。嚴格講的話,Cookie 其實應該也是算頭部注入的一種形式。因爲在 HTTP 請求的時候,Cookie 是頭部的一個字段。
**按照執行效果來分類**
**(1)基於布爾的盲注,**即可以根據返回頁面判斷條件真假的注入。
**(2)基於時間的盲注**,即不能根據頁面返回內容判斷任何信息,用條件語句查看時間延遲語句是否執行(即頁面返回時間是否增加)來判斷。
**(3)基於報錯注入,**即頁面會返回錯誤信息,或者把注入的語句的結果直接返回在頁面中。
**(4)聯合查詢注入,**可以使用union的情況下的注入。
**(5)堆查詢注入,**可以同時執行多條語句的執行時的注入