guestbook(hackme web部分writeup)

cggwz發表於2020-10-31

題目連結
開啟連結可以發現,是一個公告欄,可以自己提交標題和內容,然後會在網頁上顯示出來。
網頁原始碼肯定啥也沒有,抓包也是沒有有用的資訊,我們考慮flag在伺服器的資料庫內,所以我們就想到用sql注入。那麼資料庫的資訊會顯示在哪兒呢?那就是我們提交的標題內容顯示的地方,我們先隨便提交一些資料,比如標題為12,內容為34。提交後,檢視資訊,我們通過網址來進行注入。
首先我們有用的一個嘗試:

https://hackme.inndy.tw/gb/?mod=read&id=-1 union select 1,2,3,4#

關於這個語句我們有很多值得注意的點。(方便萌新理解,所以會說得更詳細一些)
首先是union select,這個語句是用來合併兩個搜尋,即將兩個select的結果放在同一個表內。這就有一個要求,兩個結果的列數要是相同,如果不相同會報錯。
第二點,#是什麼?這是mysql的單行註釋,把後面的語句註釋掉,消除後面語句的影響。
第三點,我們知道select後面一般加列名,表示我們需要哪一列的資訊,那麼這裡的1234是什麼?這就是select的一個特殊用法,這樣返回的是一個如下的表:

1234
1234

列名是1234,內容也是對應的數字。
那麼我們這裡最大的用處就是試探前面一個select的列數以及回顯的位置。
什麼意思?
正如前述,如果前後的結果列數不同,是會出錯的。所以我們這裡並不是直接就寫1,2,3,4,其實是嘗試1、1,2、1,2,3後得到的結果,所以我之前也是說這是一個有用的嘗試,就是示意我略過了這個過程。
那麼確定回顯的位置又是什麼意思?
因為我們要想獲取flag,必須要讓flag顯示在客戶端,那麼我們就得知道1,2,3,4分別會顯示在頁面的那個位置,或者說哪個位置會顯示。
而這也蘊含第四點,為什麼id=-1?因為id=-1時,前面的結果肯定是空,因為id通常是大於0,所以這樣我們返回的結果就是如下的結果:

1234
1234

這樣就可以確保網頁上顯示我們的數字。
關於這一點我們就說這麼多,如果有不理解的可以繼續向下看。
我們得到的結果可以發現,1不顯示,2是標題,3是內容,4是時間。也就是說我們可以利用2,3,4去回顯資訊。我們以2為例。
輸入如下的url:

https://hackme.inndy.tw/gb/?mod=read&id=-1 union select 1,database(),3,4#

我們這裡用database()代替了2,database()是用來顯示資料庫名稱的函式,代替了2以後,該url返回的結果中,標題的位置,即原來2的位置,會顯示資料庫名稱,我們看到是g8.
接下來就用類似的方法依次查詢我們需要的資訊:

https://hackme.inndy.tw/gb/?mod=read&id=-1 union select 1,(select table_name from information_schema.tables where table_schema=database() limit 0,1),3,4#

這個語句是查詢表的名字,可以得到是flag。
值得解釋的是這裡的limit,這也只是一個嘗試,limit後的第二個數字表示要返回幾個資料,而第一個數字是偏移量,表示要從第幾行開始查詢,這也是需要嘗試,只不過這裡湊巧,第一個就是我們需要的。
接下來就不一樣了,一個有用的嘗試:

https://hackme.inndy.tw/gb/?mod=read&id=-1 union select 1,(select column_name from information_schema.columns where table_name='flag' limit 1,1),3,4#

此處我們就是偏移量為1時才是我們需要的列,名字是flag
最後查詢flag即可:

https://hackme.inndy.tw/gb/?mod=read&id=-1 union select 1,(select flag from flag limit 1,1),3,4#

這樣我們就可以獲取flag了。
一個類似的練習題:
Login as admin 0.1
這一題是獲取資料庫裡的flag,方法類似。該題的題解會寫得簡略一些。

相關文章