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