sql注入的三種方式,分別是:1、數(shù)字型注入;當(dāng)輸入的參數(shù)為整型時(shí),則有可能存在數(shù)字型注入漏洞。2、字符型注入;當(dāng)輸入?yún)?shù)為字符串時(shí),則可能存在字符型注入漏洞。3、其他類型(例如:搜索型注入、Cookie注入、POST注入等)。
SQL 注入原理
SQL注入攻擊指的是通過構(gòu)建特殊的輸入作為參數(shù)傳入Web應(yīng)用程序,而這些輸入大都是SQL語法里的一些組合,通過執(zhí)行SQL語句進(jìn)而執(zhí)行攻擊者所要的操作,其主要原因是程序沒有細(xì)致地過濾用戶輸入的數(shù)據(jù),致使非法數(shù)據(jù)侵入系統(tǒng)。
SQL 注入分類
1. 數(shù)字型注入
當(dāng)輸入的參數(shù)為整型時(shí),則有可能存在數(shù)字型注入漏洞。
假設(shè)存在一條 URL 為:HTTP://www.aaa.com/test.php?id=1
可以對后臺的 SQL 語句猜測為:SELECT * FROM table WHERE id=1
判斷數(shù)字型漏洞的 SQL 注入點(diǎn):
① 先在輸入框中輸入一個單引號 '
這樣的 SQL 語句就會變?yōu)椋?/p>
SELECT * FROM table WHERE id=1'
,
不符合語法,所以該語句肯定會出錯,導(dǎo)致腳本程序無法從數(shù)據(jù)庫獲取數(shù)據(jù),從而使原來的頁面出現(xiàn)異常。
② 在輸入框中輸入 and 1 = 1
SQL語句變?yōu)椋?/p>
SELECT * FROM table WHERE id=1 and 1 = 1
語句正確,執(zhí)行正常,返回的數(shù)據(jù)與原始請求無任何差異。
③ 在數(shù)據(jù)庫中輸入 and 1 = 2
SQL 語句變?yōu)椋?/p>
SELECT * FROM table WHERE id=1 and 1 = 2
雖然語法正確,語句執(zhí)行正常,但是邏輯錯誤,因?yàn)?1 = 2 為永假,所以返回?cái)?shù)據(jù)與原始請求有差異。
如果以上三個步驟全部滿足,則程序就可能存在數(shù)字型 SQL 注入漏洞。
2. 字符型注入
當(dāng)輸入?yún)?shù)為字符串時(shí),則可能存在字符型注入漏洞。數(shù)字型與字符型注入最大的區(qū)別在于:數(shù)字型不需要單引號閉合,而字符型一般需要使用單引號來閉合。
字符型注入最關(guān)鍵的是如何閉合 SQL 語句以及注釋多余的代碼。
假設(shè)后臺的 SQL 語句如下:SELECT * FROM table WHERE username = 'admin'
判斷字符型漏洞的 SQL 注入點(diǎn):
① 還是先輸入單引號 admin'
來測試
這樣的 SQL 語句就會變?yōu)椋?/p>
SELECT * FROM table WHERE username = 'admin''
。
頁面異常。
② 輸入:admin' and 1 = 1 --
注意:在 admin 后有一個單引號 '
,用于字符串閉合,最后還有一個注釋符 --
(兩條杠后面還有一個空格?。?!)。
SQL 語句變?yōu)椋?/p>
SELECT * FROM table WHERE username = 'admin' and 1 = 1 --
頁面顯示正確。
③ 輸入:admin' and 1 = 2 --
SQL 語句變?yōu)椋?/p>
SELECT * FROM table WHERE username = 'admin' and 1 = 2 --
頁面錯誤。
滿足上面三個步驟則有可能存在字符型 SQL 注入。
3. 其他類型
其實(shí)我覺得 SQL 注入只有兩種類型:數(shù)字型與字符型。很多人可能會說還有如:Cookie 注入、POST 注入、延時(shí)注入等。
的確如此,但這些類型的注入歸根結(jié)底也是數(shù)字型和字符型注入的不同展現(xiàn)形式或者注入的位置不同罷了。
以下是一些常見的注入叫法:
- POST注入:注入字段在 POST 數(shù)據(jù)中
- Cookie注入:注入字段在 Cookie 數(shù)據(jù)中
- 延時(shí)注入:使用數(shù)據(jù)庫延時(shí)特性注入
- 搜索注入:注入處為搜索的地方
- base64注入:注入字符串需要經(jīng)過 base64 加密
常見數(shù)據(jù)庫的注入
攻擊者對于數(shù)據(jù)庫注入,無非是利用數(shù)據(jù)庫獲取