一、原理
首先,先了解一下原理,就拿一個最簡單的例子吧,登錄功能,如果后臺sql語句執(zhí)行是:
通過傳來的用戶名和密碼查找數(shù)據(jù)庫是否有記錄。當(dāng)我們用戶名輸入一個萬能賬號,' or 1=1--,那后臺語句就變成了:
1=1為真,密碼輸入什么都可以,因為被--注釋掉了,所以會登錄成功??傊痪湓?,sql注入就是繞過程序限制,讓數(shù)據(jù)在數(shù)據(jù)庫中執(zhí)行。
二、概念
簡單理解其原理后,來看一下枯燥的概念。
注入分為兩大類,一個是數(shù)字型注入,一個是字符型注入。數(shù)字型注入一般都是url中帶id的,像文章地址后就跟有id號,或者是商品地址等。我在網(wǎng)上找了一個網(wǎng)站的商品地址,后有id,跟了一個單引號后報錯,敏感信息就不外露了,如下圖:
可能原來查商品的sql語句是where id=38,加上單引號后變成了where id=38',這樣語句有錯誤,便把錯誤信息返回了,這個信息屬于有價值了,已經(jīng)暴露了表名,sql語句和數(shù)據(jù)庫類型。
像這種數(shù)字型的注入一般出現(xiàn)在php或者asp的網(wǎng)站中,因為他們屬于弱類型語言,他們的機(jī)制會將變量的數(shù)據(jù)類型自動推導(dǎo)出來,在這塊,強(qiáng)類型語言會更有優(yōu)勢。
字符型sql注入就是原理中說到的,它與數(shù)字型最大區(qū)別在于字符型一般都需要單引號去閉合。例如下圖中登錄,用的字符型注入,當(dāng)然沒有登錄成功:
三、分類
主要是兩大類一個字符一個數(shù)字。當(dāng)然,往細(xì)了分也可以分出多種,下面簡單理解一下: