解題思路
拿到題目的時候,只有一個登入介面
拿到登入介面,而且還伴隨著有註冊介面,聯想到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語句注入 | 如果報錯結果為同一特定文字,那麼報錯注入大部分情況下沒有用 |