前言
在學(xué)習(xí)這篇文章之前,至于要學(xué)習(xí)了SQL注入的前提知識(shí),可以參考之前寫的一篇sql注入之必備的基礎(chǔ)知識(shí)。
認(rèn)識(shí)SQL注入
最開始就從最簡(jiǎn)單的開始,進(jìn)入到less-1開始我們的SQL注入學(xué)習(xí)之旅。
通過改變http://localhost/sqlilabs/Less-1/?id=3
的id值,頁(yè)面上呈現(xiàn)不同的內(nèi)容(username,password)。
那么我們就可以猜測(cè)在后臺(tái)中的SQL語句就是根據(jù)前臺(tái)傳入的id值來去對(duì)應(yīng)的數(shù)據(jù)。
那么SQL語句的寫法為:
select username,password from table where id=input
判斷存在SQL語句
接下來進(jìn)行做測(cè)試,使用以下的語句進(jìn)行測(cè)試:
http://localhost/sqlilabs/Less-1/?id=3 and 1=1
http://localhost/sqlilabs/Less-1/?id=3 and 1=2
這個(gè)時(shí)候頁(yè)面沒有任何的變化,這是不和符合我們預(yù)期的結(jié)果,因?yàn)楫?dāng)id=3 and 1=2
時(shí),SQL語句變?yōu)?code>select username,password from table where id=3 and 1=2頁(yè)面應(yīng)該不會(huì)有內(nèi)容。
確定存在SQL語句
使用了之前的語句不行之后,我們使用如下的語句:
http://localhost/sqlilabs/Less-1/?id=3'
當(dāng)URl是以上的SQL語句時(shí),頁(yè)面上顯示SQL執(zhí)行錯(cuò)誤信息You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''3'' LIMIT 0,1' at line 1
。
其中最關(guān)鍵的錯(cuò)誤信息是:
''3'' LIMIT 0,1'
最外層的引號(hào)是mysql出錯(cuò)時(shí)自動(dòng)加上的。那么實(shí)際的SQL語句是 '3'' LIMIT 0,1
。我們發(fā)現(xiàn)在我們輸入的3'被引號(hào)包圍了,那么我們之前猜測(cè)的select username,password from table where id=input
有誤,實(shí)際的后臺(tái)的SQL語句應(yīng)該為:
select username,password from table where id='input'
SQL注入驗(yàn)證
在確定存在了SQL注入之后,同時(shí)知道了后臺(tái)SQL寫法,那么此時(shí)我們就可以注入自己的SQL注入的代碼。
由于我們可以控制id的值,那么最終輸入的SQL語句會(huì)變?yōu)椋?/p>
select username,password from table where id='input 攻擊代碼'
此時(shí)我們就可以構(gòu)造如下的payload來驗(yàn)證我們的想法。由于我們的輸入是被一對(duì)單引號(hào)包裹的,所以我們輸入的語句必須要能夠不被單引號(hào)影響。要么閉合單引號(hào),要么注釋掉單引號(hào)。(可以參考前面的文章)
#閉合單引號(hào)
id=1 and '1' = '1 #
#注釋單引號(hào)
id=1 and 1=1 # 或者 id=1 and 1=1--+
當(dāng)我們使用上面的這3個(gè)payload之后,頁(yè)面顯示的結(jié)果是符合預(yù)期的。那么我們也可以確定id參數(shù)確實(shí)是存在SQL注入的。后臺(tái)的SQL語句的寫法也的確是select username,password from table where id='input'
。
在確定了SQL語句之后,接下里就是注入SQL注入代碼了。
執(zhí)行SQL注入
使用SQL語句來進(jìn)行脫褲,這一點(diǎn)是十分關(guān)鍵的。如果僅僅是知道存在SQL注入但是無法脫褲,那么實(shí)際上這個(gè)漏洞對(duì)于該網(wǎng)站的危害性還是很小的。如何構(gòu)造正確的SQL語句進(jìn)行脫褲,這一點(diǎn)也是十分重要的,在下一篇文章中將會(huì)詳細(xì)地講解SQL注入的詳細(xì)的步驟。
注入類型判斷
在本題中的SQL語句就稱之為字符型的SQL注入,因?yàn)槲覀兊妮斎朐赟QL語句執(zhí)行的過程中被單引號(hào)所包括,其實(shí)在SQL語句執(zhí)行中,這個(gè)id參數(shù)被當(dāng)做是一個(gè)字符類型的數(shù)據(jù)。除了有字符型的SQL注入,當(dāng)然還有數(shù)字型的SQL語句。那么如何區(qū)分這兩者呢?
字符型SQL注入
在確定存在SQL語句這節(jié)中,當(dāng)我們輸入id=3'
是頁(yè)面的出錯(cuò)信息是 '3'' LIMIT 0,1
。我們發(fā)現(xiàn)3'被引號(hào)所包圍,那么說明這個(gè)就是一個(gè)字符型的SQL注入了。
數(shù)字型SQl注入
在less-2中,當(dāng)我們同樣輸入id=3'
時(shí),頁(yè)面的出錯(cuò)信息是 ' LIMIT 0,1
,那么就說明是一個(gè)數(shù)字型的注入了同時(shí)還存在limit
關(guān)鍵字,那么我們猜測(cè)less-2中的SQL注入為:
select username,password from table where id=input limit 0,1
以上都可以通過查看源代碼的方式來進(jìn)行驗(yàn)證。
SQL語句判斷
但是很多時(shí)候我們通過單引號(hào)的方式并不能返回sql執(zhí)行語句的錯(cuò)誤信息,就無法通過錯(cuò)誤信息得到注入類型。因?yàn)楹芏鄷r(shí)候在后臺(tái)的SQL語句會(huì)有各種千奇百怪的寫法。
在less-3和less-4中的寫法就是如下:
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1"
在less-3中使用了括號(hào)來包裹用戶的輸入
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
在less-4中使用了雙引號(hào)來包裹用戶的輸入,那么當(dāng)你即使加上了單引號(hào)進(jìn)行測(cè)試的時(shí)候還是無法出發(fā)SQL語句執(zhí)行錯(cuò)誤。
所以說很多時(shí)候僅僅使用單一的符號(hào)進(jìn)行判斷是完全不夠的,要多使用不同類型的符號(hào)來進(jìn)行測(cè)試的判斷,使用包括',",\,(,=,等等字符,甚至有時(shí)候還要使用其他的探查方法,因?yàn)槟銦o法判斷后臺(tái)的SQL語句的寫法,而且目前很多的網(wǎng)站開發(fā)人員已經(jīng)有了一定的安全意識(shí),可能常規(guī)的SQL探查語句也無法使用。關(guān)于其他跟多SQL注入的探查語句,網(wǎng)上有很多的資料。
總結(jié)
SQL注入的判斷沒有萬能方法,只有不斷的進(jìn)行嘗試,當(dāng)你有了一定的經(jīng)驗(yàn)之后,就會(huì)對(duì)注入類型有了自覺,同時(shí)對(duì)于SQL注入的判斷也會(huì)更快。以上就是這篇文章的全部?jī)?nèi)容了,如果要對(duì)實(shí)際的網(wǎng)絡(luò)中的網(wǎng)站進(jìn)行安全測(cè)試,以上的知識(shí)是遠(yuǎn)遠(yuǎn)不夠的。小編會(huì)繼續(xù)更新更多sql注入的文章,請(qǐng)繼續(xù)關(guān)注腳本之家。
您可能感興趣的文章:- sql注入之手工注入示例詳解
- sql注入之必備的基礎(chǔ)知識(shí)
- 利用SQL注入漏洞登錄后臺(tái)的實(shí)現(xiàn)方法
- PHP中防止SQL注入實(shí)現(xiàn)代碼
- PHP+MySQL 手工注入語句大全 推薦
- 整理比較全的Access SQL注入?yún)⒖?/li>
- php中防止SQL注入的最佳解決方法
- php防止SQL注入詳解及防范
- 利用SQL注入漏洞拖庫(kù)的方法
- SQL注入之基于布爾的盲注詳解