解題思路

拿到題目的時候,只有一個登入介面



拿到登入介面,而且還伴隨著有註冊介面,聯想到SQL的二次注入漏洞

嘗試註冊admin'#,並使用admin登入,發現登入失敗,說明可能不存在SQL二次注入

註冊之後,登入進去,在check.php頁面檢視原始碼的時候發現有一個關於admin的註釋:



可能是編碼不一致的問題,開啟Notepad++,先選擇使用ANSI編碼,貼上之後,再使用UTF-8編碼,得到內容:



可能關鍵的資訊在admin的電話,看來必須要知道admin的電話才行。

當前頁面很少,想著如果可以看原始碼是不是有解題思路,於是使用dirsearch掃描了一下,希望能有個原始碼檔案:



在訪問了所有的檔案後,事與願違,並沒有原始碼檔案,但是db.php仍然暗示了需要使用SQL注入

通過一番尋找,由於頁面暗示了電話問題,所以我們猜想可能注入點在電話中

為什麼?且看圖

空色框內的變數2顯然就是查詢資料庫之後的結果,所以這個2很可能就是回顯點

而在整個靶場中,唯一能夠讓我們控制電話的只有register.php介面。

再次開啟register.php介面,進行html的程式碼審計(因為得不到php原始碼):



顯然必須要檢視form表單



這很正常,在註冊介面裡面,設定電話號碼的長度是11

但是,對於hack來說,長度為11顯然限制了我們的手動直接在頁面注入,這就是此地無銀三百兩的細節

好,我們輸入SQL注入語句,報錯,原因是,它必須要數字:



所以系統會對非數字電話進行過濾

辦法是轉換成二進位制或者十六進位制(二進位制經過測試不能成功,且看16進位制)。



將SQL注入語句轉換成16進位制,記住,一定要在前面加0x

傳送成功,然後我們登入檢視一下

我們剛剛輸入的內容在回顯欄裡面,點選check

相比於剛才,多了一條語句:There only 1 people use the same phone as you

同時也證明了兩點,只有一列可以回顯,而且是數字型注入。

於是之後就可以構造查詢語句:









最後再查一下phone,就可以找到flag了

此外,在查詢的時候,遇到錯誤會統一報錯為db,error

這樣下來,報錯注入就行不通了,即不能用xmlupdate

總結

做這道題遇到的障礙以及解決方法

障礙 方法
不能及時判斷SQL注入點 在找到註釋提示admin的電話號碼的時候,以及在頁面告訴說有多少人和你是同一電話號碼的時候,在電話號碼只能輸入11位的時候,在電話號碼過濾非數字的時候,都在暗示,這是一個SQL注入點
不能及時繞過非數字過濾 繞過非數字檢測過濾的方法就是將字串轉換為數字,最常見的就是二進位制和十六進位制
不能及時判斷SQL資料庫結構 從小到大,從第一列開始判斷,即select 1開始,隨後增減列數,一定要在後面添加註釋
不能準確使用SQL語句注入 如果報錯結果為同一特定文字,那麼報錯注入大部分情況下沒有用