以下所有操作建議在虛擬機中進行~
First you shoud have a 文件夾在你電腦上的例如phpstudy的WWW文件夾中
首先進入這里創建數據庫,after that ,let‘s we go~
不管是第幾關,我們的最終目標是獲得用戶密碼,從而獲取最高權限!
以下的學習過程中如果遇到那里不會的或者不清楚的地方,歡迎大家留言,我將盡力幫助大家~
第一關
首先我們確定他是什么類型的注入方式,輸入1=2 --+ 頁面回顯正常,說明不是字符型注入
輸入帶引號的1‘,出現問題,說明可能存在字符型的注入
我們在后面加上--+進行一下閉合,(--+就是注釋符號,注釋了后面的語句),look,回顯正常,說明是單引號字符型注入
接下來用order by 來判斷表有幾列數據,發現他有3列數據(為4時出錯,為3時正常)
我們將id改成一個不存在的數字,如“417”。判斷頁面有幾個顯示位,使用聯合查詢語句union select 發現只有兩個顯示位
接下來我們爆破數據庫的數據庫名,表名,列名,字段信息
首先我們獲得有多少個數據庫
查詢我們的數據庫的版本和名字,看來是security
我們接下來查詢security數據庫的表名,發現有四個表 分別是emails,referers,uagents,users 很明顯我們最后的目標是users表
接下來我們看看user表中都有哪些列,發現有user和password列(因為版本不一樣,可能列名不一樣,但是一定會有用戶名和密碼兩列)
我們來獲得用戶名和密碼的字段
0x3a: 0x是十六進制標志,3a是十進制的58,是ascii中的 ':' ,用以分割pasword和username。
噔噔噔!闖關結束
第二關
發現第二關和第一關的區別在於他不是字符型注入了,是數字型注入了(數字注入的話就沒有1后面的‘號了)
接下來就是獲取表有個顯示位,發現是3個,之后嘞就是獲取數據庫名,表名,列名,字段名,和第一關一模一樣
其實對於第一和第二關還有另外一種解法,嘿嘿
獲得當前數據庫的表名
獲得user表的列名
額,沒有顯示全,我們再使用看看,其他的列名
獲得user和password的字段值
同樣使用not in顯示其他的值
第三關
這一關使用‘)進行閉合 這關是基於錯誤的GET單引號變形字符型注入
第四關
這關是基於錯誤的GET雙引號變形字符型注入(但是我試了一下發現單引號其實也是可以的,不知道為什么)
第五關
看這關是不是和之前關卡不太一樣嘍,沒有顯示位了,遇到這個情況有三種結果:布爾盲注,報錯型注入,時間延遲注入(就是通過給你顯示延遲表示你輸入的對不對的一種形式)
我們測試一下發現是時間延遲注入,並且還是單引號字符型注入
時間延遲注入算是一種盲注,因為它沒有回顯的信息
時間延遲型手工注入,正確會延遲,錯誤沒有延遲。id無所謂,不看回顯,可以通過瀏覽器的刷新提示觀察延遲情況,但是id正確的時候的回顯有利於觀察。
我們來看一下數據庫的名字是幾個字符,如果是8個字符,則延遲2秒,發現延遲,則證明是8個字符 ?id=1' and if(報錯型核心部分,sleep(3),1)--+
我們看看第一個字符是什么,因為是盲注,所以需要一個一個試,很麻煩,我們知道咱的數據庫的名字,所以從s開始試, 一個一個試最終爆破得到left(database(),8)='security'
得到數據庫名字之后我們來獲取表名,爆破到第二張表為referer,下圖是爆的第一個字母,因為有點類似盲注,所以特別慢。其他的就沒有截圖
終於在第三張表爆破到user表,名為users。limit 后面跟的兩個數字是從幾到幾,1,1就是第二張表的意思 2,1就是第三張表的意思 最后面那個1是對應的left ,從左數共幾個 為1時,后面我們就放一個字母
爆完表名,爆列名
首先嘗試定向爆破,以提高手工注入速度,修改limit x,1 中的x查詢password是否存在表中,lucky的是limit 3,1的時候查到了password列,同樣的方法查詢username ,又一個lucky,接下來爆破字段的值。
爆完列名,爆字段名 爆破到第一個用戶的名字dumb,密碼dumb,需要注意的是,mysql對大小寫不敏感,所以你不知道是Dumb 還是dumb。
這是我們爆的那個數據庫發現確實一樣
有沒有發現這種方法很繁瑣,很累,一直重復試才能試出幾個,所以還有別的方法
布爾型手工注入,正確會回顯,錯誤不回顯
數據庫第一個字符小於t有回顯
數據庫第一個字符大於t無回顯, 一點一點嘗試,最終確定的庫名為security
接下來確定表名,第一個字母得出是r,其他的步驟還是一樣,修改limit x,1和left中的位數限定數字,第一張表是emails,爆破到第二張表為referer,終於在第四張表爆破到user表,名為users。
接下來爆列,得出第二列是用戶名,第三列是密碼(雖然我只截圖了兩張,但是里面的每個字母都是通過二分法,大於小於,這樣的方式測試出來的)
最后一步爆用戶名和密碼(只截圖了第一個用戶名和密碼,並且大小寫不知道)
當然還有第三種方法,嘿嘿 ---->報錯注入 簡單說就是通過反饋的錯誤信息,在反饋信息中顯示出你想知道的信息
首先介紹三種報錯注入常用的語句:
(1). 通過floor報錯
select count(*), concat((select version()), floor(rand()*2))as a from information_schema.tables group by a;
其中payload為你要插入的SQL語句
需要注意的是該語句將 輸出字符長度限制為64個字符
(2). 通過updatexml報錯
and updatexml(1,payload,1)
同樣該語句對輸出的字符長度也做了限制,其最長輸出32位
並且該語句對payload的反悔類型也做了限制,只有在payload返回的不是xml格式才會生效
(3). 通過ExtractValue報錯
and extractvalue(1, payload)
輸出字符有長度限制,最長32位。
payload即我們要輸入的sql查詢語句,這里面的concat是聚合函數,使用聚合函數進行雙注入查詢時,會在錯誤信息中顯示一部分錯誤信息。
下面我們使用floot報錯進行演示。爆數據庫
爆用戶
爆表名
爆列名
第六關
和第五關一樣,不再贅述,只是將1' ----->(換成了)1"
第七關
首先判斷是字符型還是數字型,發現是字符型,並且出現了一個我們從來沒見過的東西use outfile
可能會有很多小白和我一樣,對數據庫file權限和 into outfile這個命令比較陌生,所以在這里科普一下file權限和into outfile這個函數。
數據庫的file權限規定了數據庫用戶是否有權限向操作系統內寫入和讀取已存在的權限
into outfile命令是filefile系列函數來進行讀取敏感文件或者寫入webshell
字符型的話就要在1后面加‘或“號,所以我們來試試
需要多次嘗試1‘ 1“ 1’) 1”) 1‘)) 最后我們發現是1‘))
這關我們主要就是往服務器上寫入文件,比如一句話木馬啥的,我們首先要有一個存儲文件的路徑,也可以手動去查看
找到路徑之后,我們往這個路徑下寫入一個文件名為longshisan的php文件,主要這里的路徑要用雙斜杠\\,否則建立出來的文件名會加前綴
雖然他回顯告訴我們錯誤,但是確實建成功了,並且在這里有一個安全措施,就是不允許覆蓋,你建立了longshisan的php文件,就不能重復建立了
如果寫到www文件夾下就可以用localhost前綴了
我們可以加入一句話木馬,到時候我們就可以通過這個文件進入數據庫
用中國菜刀就可以獲得這個文件夾的結構了
第八關
發現是字符型注入,並且通過回顯的信息可以看出是布爾盲注
首先看看有沒有file權限,發現有,那咱這關就過去了
你也可以用向第五關的方法時間注入啊,二分法猜測啊在這都可以用
第九關
上來先判斷是字符型注入,並且是延遲型注入(咋判斷是不是延遲型,當你用二分法時不管左邊還是右邊都是對的,說明二分法就做不了了)
時間注入在第五關做了詳細的描述,在這里不再過多的贅述
數據庫名長度為8
獲得數據庫名,剩下的按照第五關的操作走就行
獲得密碼
第十關
第十關就是把第九關的單引號‘換成雙引號“就可以啦
獲得用戶名密碼
1-10關結束
該文章有參考了以下的網頁: