進入第六關,首先咱們仍是在url裏面增長id參數。sql
白盒階段,咱們首先仍是看源碼。數據庫
首先,根據if判斷語句裏面的返回,咱們確認了這個位置的注入點是布爾型的盲注。less
由於根據代碼成功與否,網頁會給咱們返回不一樣的內容,雖然沒法直接讓網頁返回咱們但願看到的信息,可是能夠從代碼成功與否的不一樣返回結果,來獲取咱們想要的東西,這也是我認爲布爾盲注的判斷狀況。函數
同時,根據代碼:測試
$id = '""'.$id.'""'; $sql = "SELECT * FROM users WHERE id=$id LIMIT 0,1";
咱們能夠知道,這裏咱們想要閉合代碼,須要用到雙引號。網站
因此,咱們能夠構造如下測試payload:url
1" and 1=1 -- 1" and 1=2 -- //上面兩條用於在黑盒狀況下判斷是否存在注入。 1" and 1=((select count(*) from information_schema.schemata)>1) -- //上面一條代碼用於判斷網站有幾個數據庫,經過修改小於號後面的內容來獲得準確答案。 1" and length((database()))>1 -- //上面一條代碼用於判斷當前數據庫名稱字符長度。 1" and substr((database()),1,1)='a' -- //上面一條代碼用於爆當前數據庫名稱。
這裏,由於前面已經作過足夠詳細的過程,這裏就不一步一步操做了。線程
第六關,通關。code
進入第七關,先在url中添加id參數。orm
而後咱們直接查看源碼。
經過if判斷語句,咱們看出,代碼成功執行與否,依然會返回不一樣的結果,因此咱們就只須要關注一行代碼。
$sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";
根據這條代碼,咱們能夠知道,這條語句,想要閉合,咱們可使用 '))來進行閉合,以此進行sql盲注。
同理,咱們可使用上面總結的代碼進行盲注。
第七關,通關。
廢話不說了,直接看源碼。
首先,咱們能夠看到,if判斷框裏面返回的結果依然是不一樣的,若是代碼正常執行,網頁會返回you are in .........,若是代碼執行失敗,則不會有任何返回,咱們能夠經過這點區別,直接進行布爾型盲注。
同時,咱們只須要查看下方代碼:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
經過這行代碼,咱們就知道,閉合只須要使用單引號。
第八關,通關。
第九關,直接查看源碼。
首先,咱們看if判斷語句,代碼執行成功和失敗,網頁上咱們能看到的返回結果都是「you are in........」,可是,咱們若是仔細看代碼的話,就會發現其實代碼執行成功和失敗,兩個代碼塊是會有區別的,而區別在於else下面的代碼塊中,多了下面這行代碼:
echo '<font color= "#0000ff" font size= 3>';
而這行代碼,若是咱們不點擊查看頁面源碼的話,是很難發現的,因此,這個關卡,就出現了兩種可使用的破關辦法。
一.時間盲注
時間盲注最常利用到的函數是sleep()函數。經過這個函數,咱們可讓頁面延時回覆,而經過網站回覆的時間,咱們就能夠以此判斷咱們執行的代碼知否成功,經過這個手法,來拿到本身想要獲得的數據。
如何測試網頁是否存在sql時間盲注,最簡單的手段就是在閉合代碼後,直接在後面接上 and sleep(3)而後刷新網頁,若是網站延時三秒回覆,那麼就說明了該處存在時間盲注。
這裏還要代入一個知識點,就是if語句,格式以下:
if(條件,條件成功返回結果,條件失敗返回結果)
利用if語句和sleep函數,咱們就能夠直接獲取咱們但願獲得的數據。
經常使用payload以下:
1' and if(length((database())>1,sleep(3),1)) -- //若是當前數據庫名稱字符長度大於一,網站延遲三秒顯示。 1' and if(substr((database())1,1)='a',sleep(3),1) -- //若是當前數據庫名稱第一個字母是a,網站延遲三秒顯示。
能夠看到,時間盲注跟布爾型盲注的區別就是多了一個if函數,咱們只須要將以前布爾盲注的代碼放在if語句的條件位置,就能夠完成時間盲注,由於截圖也沒法看出效果,因此這裏就不截圖了。有興趣的能夠本身嘗試。
ps:每關的代碼的隔斷,都是按照每關的代碼進行的,若是直接複製代碼的話,須要看清楚關卡。
二.布爾型盲注
以前說到,第九關存在兩種破關方式,時間盲注和布爾盲注。其實全部的盲注,均可以使用時間盲注的手法來進行,但不是每種時間盲注均可以使用布爾盲注的手法,這一點必定要記清楚。
這裏雖然網頁的返回結果一致,可是else的代碼塊中,又多echo了一個font標籤,而這會顯示在網頁源碼中,直接查看網頁是很難看到區別的。
可是,咱們很清楚,沒測試一個字母,都要查看網頁源碼是個很麻煩東西。
因此,咱們能夠想到這樣一點,若是咱們的代碼執行失敗,網頁會給咱們返回else代碼塊裏面的內容,若是咱們的代碼執行成功,網頁會跟咱們返回if代碼塊裏面的內容。由於這兩個代碼存在的區別(else代碼塊多了一條echo)就會致使返回else代碼塊內容的返回包報文長度會比返回if代碼塊內容的返回包長。
話很少說,上圖。
能夠看到,若是利用burp看的話,就能夠很明顯的查看到代碼執行成功和失敗了。
固然,burp除了能夠用在這種狀況,還能幫咱們減小時間盲注的等待時間。這個,我會在下一關進行時間盲注的時候詳細說明。
第九關,通關。
第十關,直接看源碼。
眼尖的朋友能夠看出來,這一關和第九關幾乎一致,只是代碼的隔斷從單引號變成了雙引號。
因此,通關第九關使用的手法,在這裏依然適用,那麼通關方式我就不講了,直接跟你們詳細的說一下,如何使用burp減小咱們sql時間盲注的時間。
首先,咱們在頁面上構造一條時間盲注的語句。
ps:這裏在網頁上構造的緣由是由於咱們可使用hackbar直接將咱們輸入的空格等進行轉義,若是是抓包以後再寫,會很麻煩。
payload以下:
1" and if(length((database()))<1,sleep(3),1) //這條代碼是判斷當前數據庫名稱長度是否小於一,若是小於一,網站延遲三秒回覆,大於一,則正常回復。
使用burp抓包,並直接將其ctrl+r放入repeater模塊。
這裏咱們能夠看右下角的兩個數字,一個879 bytes 一個 30millis。
前面的那個,表明了返回包的字節數,後面那個,則是響應時間,單位是毫秒。
由於咱們知道,數據庫名稱長度確定大於一,因此咱們將一改成十,看一下結果。
這裏能夠看到,下方的兩個數字變成了916 和 3080。
這是一個更清楚的進行時間盲注的手法,可是還不是我要說的節省時間的方法,畢竟雖然能夠更清晰的查看到代碼成功與否,可是須要等的時間,咱們仍是等了。因此,爲了節省時間,咱們就須要使用burp的爆破模塊。
固然,這裏要注意一點,在使用burp的爆破模塊進行時間盲注的時候,線程數必定要調成1
將咱們剛纔用到的請求包放到爆破模塊裏面,而且將判斷字符長度的1設置爲變量。
設置完成,直接開始爆破。
這裏能夠看到,由於咱們設置的是小於,因此在爆破到8的時候,明顯返回變慢了,這表明代碼執行成功了,咱們也就能夠知道,當前數據庫的字符長度爲8。由於8<8不成立,因此爆破到8的時候網站仍是正常返回,可是8<9成立,因此網站會延遲返回。
經過這個方法,咱們也能夠猜數據庫名,表名,字段名等。
第十關,通關。