漏洞重溫之sql注入(二)

漏洞重溫之sql注入(二)

sqli-libs通關之旅

Less-06

進入第六關,首先咱們仍是在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

Less-07

進入第七關,先在url中添加id參數。orm

而後咱們直接查看源碼。

經過if判斷語句,咱們看出,代碼成功執行與否,依然會返回不一樣的結果,因此咱們就只須要關注一行代碼。

$sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";

根據這條代碼,咱們能夠知道,這條語句,想要閉合,咱們可使用 '))來進行閉合,以此進行sql盲注。

同理,咱們可使用上面總結的代碼進行盲注。

第七關,通關。

Less-08

廢話不說了,直接看源碼。

首先,咱們能夠看到,if判斷框裏面返回的結果依然是不一樣的,若是代碼正常執行,網頁會返回you are in .........,若是代碼執行失敗,則不會有任何返回,咱們能夠經過這點區別,直接進行布爾型盲注。

同時,咱們只須要查看下方代碼:

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

經過這行代碼,咱們就知道,閉合只須要使用單引號。

第八關,通關。

Less-09

第九關,直接查看源碼。

首先,咱們看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除了能夠用在這種狀況,還能幫咱們減小時間盲注的等待時間。這個,我會在下一關進行時間盲注的時候詳細說明。

第九關,通關。

Less-10

第十關,直接看源碼。

眼尖的朋友能夠看出來,這一關和第九關幾乎一致,只是代碼的隔斷從單引號變成了雙引號。

因此,通關第九關使用的手法,在這裏依然適用,那麼通關方式我就不講了,直接跟你們詳細的說一下,如何使用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成立,因此網站會延遲返回。

經過這個方法,咱們也能夠猜數據庫名,表名,字段名等。

第十關,通關。

相關文章
相關標籤/搜索