SQL手工注入保姆級(jí)教程(封神臺(tái)黑客靶場(chǎng)1-1)
注:本教程僅供交流學(xué)習(xí)使用,請(qǐng)遵守網(wǎng)絡(luò)安全相關(guān)法律法規(guī),如果使用本技術(shù)對(duì)其他網(wǎng)站進(jìn)行攻擊,本人概不負(fù)責(zé)!
本教程需要一定的Mysql數(shù)據(jù)庫知識(shí),如果看不懂本教程中的代碼可以學(xué)習(xí)Mysql。
現(xiàn)在由我來講解一下封神臺(tái)黑客靶場(chǎng)1-1 SQL注入攻擊原理與實(shí)戰(zhàn)演練。在開始實(shí)際操作前,我們先來了解一下sql注入到底是什么。由于一些開發(fā)者在開發(fā)過程中,直接將URL中的參數(shù),http body中的post參數(shù)等其他外來用戶輸入?yún)?shù)與SQL語句進(jìn)行拼接,導(dǎo)致了我們可以執(zhí)行任何SQL語句。
例:<?php
????????????...
????????????$id=$GET('id');
????????????$getid="select id from users where user_id=‘$id'";
????????????$result=mysql_query($getid) or die('<pre>'.mysql_error.'</pre>');
????????????$num=mysql_numrows($result);
以上PHP代碼來自于CTF特訓(xùn)營P14
我們看一下$id這個(gè)變量,這個(gè)變量會(huì)直接與SQL語句進(jìn)行拼接,那么,如果我們傳入這樣一段SQL指令:
-1‘ union select 1,2,3 --
那么,SQL語句將會(huì)變成
select id from users where user_id = '-1' union select 1,2,3
到這里可能會(huì)有這樣一個(gè)疑問:為什么要閉合單引號(hào)且為什么有一個(gè)單引號(hào)沒有了呢。
我們接下來逐一解答。
Q:為什么要閉合單引號(hào)?
A:我舉一個(gè)例子你就明白了。如果我們不閉合單引號(hào),這一段SQL語句將會(huì)變?yōu)?/strong>
select id from users where user id = '-1 union select 1,2,3'
發(fā)現(xiàn)問題了嗎,原本我們注入的SQL語句,在單引號(hào)中變成了字符串,導(dǎo)致我們注入的SQL語句無法執(zhí)行。
Q:為什么有一個(gè)單引號(hào)不見了
A:--是Mysql中的注釋符,注釋掉了一個(gè)單引號(hào),才能使得前面的單引號(hào)閉合。
如果沒有注釋,我們的SQL語句將會(huì)變成
select id from users where user_id = ''-1 union select 1,2,3'
說到這里,在看本教程的各位有沒有對(duì)SQL注入的原理和方法有一個(gè)基本的了解呢?
——————分割線——————
原理和技術(shù)講完了,我們現(xiàn)在進(jìn)入靶場(chǎng)實(shí)戰(zhàn)。
我們這次完成的是封神臺(tái)黑客靶場(chǎng)1-1,關(guān)卡詳情如下。

點(diǎn)擊傳送門后,我們進(jìn)入了靶場(chǎng),我們可以看到,靶場(chǎng)首頁有一個(gè)鏈接。

點(diǎn)擊鏈接后,我們跳轉(zhuǎn)進(jìn)了一個(gè)貓舍介紹界面,網(wǎng)址為cntj8003.ia.aqlab.cn?id=1
那么我們前面有講過,可以利用GET進(jìn)行傳入SQL語句,我們來試一下。

首先我們傳入一個(gè)單引號(hào),來檢查是否存在單引號(hào)閉合,如果傳入后頁面正常,則存在單引號(hào)閉合,如果傳入后頁面異常,則不存在單引號(hào)閉合,我們可以繼續(xù)嘗試雙引號(hào)閉合。

傳入單引號(hào)進(jìn)入頁面發(fā)現(xiàn)頁面異常,則不存在單引號(hào)閉合,那么如果我們傳入雙引號(hào)呢?

返回結(jié)果依舊是頁面異常,由此我們斷定,此處無需閉合,那么,我們就可以放心的去傳入我們的SQL代碼了。

我們接下來就要去查詢SQL語句向
該表查詢了多少字段,這里使用Order by語句,為后面的聯(lián)合查詢做準(zhǔn)備,因?yàn)槁?lián)合查詢需要有相同的字段數(shù)。
我傳入了order by 1,頁面回顯正常,那么我們繼續(xù),order by 1,2,頁面依舊回顯正常,當(dāng)我再次輸入order by 1,2,3時(shí),頁面回顯異常,到這里,我們可以判斷出當(dāng)前SQL語句查詢了兩個(gè)字段。



通過order by知道了字段數(shù)后,我們接下來就可以進(jìn)行聯(lián)合查詢了。
首先我們可以查詢一下數(shù)據(jù)庫名字,運(yùn)用下面這段SQL語句
and 1=2 union select 1,database()
得到了數(shù)據(jù)庫名字為maoshe

之后,我們可以嘗試獲取表名。
我們繼續(xù)注入SQL語句
and 1=2 union select 1,table_name from information_schema.tables where table_schema='maoshe';
通過這個(gè)查詢,可以查詢出maoshe中的表名,我們得到了一個(gè)admin表(其實(shí)還有其他的表,但是,我只想用admin表,基本賬號(hào)密碼都在這個(gè)表中,但是,如果你想知道其他表名,可以使用limit,limit用法我會(huì)在后面講到)

既然表名確定了,我們就要去猜字段了,我們繼續(xù)查詢。
and 1=2 union select 1,column_name from information_schema.columns where table_name='admin'
通過查詢,我得到了一個(gè)id字段,但是,這并不是我們想要的結(jié)果,而且,這個(gè)表中不會(huì)僅有這一個(gè)字段。接下來,我們就要用到limit
在MySQL中,limit有一個(gè)遍歷的功能(或許不叫這個(gè)名字,但我比較喜歡這樣理解)
用法:limit 1,1 跳過第一個(gè),查詢后面一個(gè)。
? ? ? ? ? ? limit 2,1跳過第二個(gè),查詢后面一個(gè)
以此類推
那么,我說到現(xiàn)在,你可能猜到我要怎么做了。

我們?cè)谖覀兩厦娴腟QL語句中插入 limit 0,1 ?limit 1,1 limit 2,1來遍歷字段。
我們分別得到了id,username,password字段,當(dāng)然,你可以繼續(xù)遍歷,不過,既然得到了username和password字段,我們的目的達(dá)到了,為什么要繼續(xù)遍歷呢?



勝利近在咫尺,我們進(jìn)行最后一步查詢
我們要查詢 username 和 password 字段的內(nèi)容
查詢username:and 1=2 union select 1,username from admin
查詢password:and 1=2 union select 1,password from admin
查詢到username為admin,password為hellohack


至此,封神臺(tái)黑客靶場(chǎng)1-1順利通關(guān)。
當(dāng)然,本教程所講為手工注入方法,同樣可以使用sqlmap進(jìn)行自動(dòng)注入,這里就不進(jìn)行介紹了。
希望大家能后喜歡本教程,后續(xù)我還會(huì)繼續(xù)做其他系列,本教程中如果存在錯(cuò)誤也歡迎指正,相互學(xué)習(xí)。