天天看點

BUUCTF之[GXYCTF2019]BabySQli

題目

BUUCTF之[GXYCTF2019]BabySQli

這題看到這個頁面,而且題目上說的。給人的感覺就是個SQL注入題。。。。

啟動BurpSuite抓包看看

BUUCTF之[GXYCTF2019]BabySQli

有兩個可疑點:

  • 一是報使用者錯誤(wrong user!),通常如果有這種錯誤的時候要先爆破賬号,得到正确的賬号後再去爆破密碼。
  • 這裡傳回的綠色部分明顯是加密後的資料

首先提取綠色部分的資訊,經過排查發現可以先base32解密,再base64

原資料:

MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5
           

先base32解密:

再base64解密:

看到這個SQL語句,果然是需要先爆破賬号。。。

但實際上并不需要真的爆破賬号,因為它的使用者名就是:

admin

。這在許多CTF裡很常見,因為它并不是真的要考爆破賬号,是以它會設定一個常見的值。就好比是這個admin就很常見。

BUUCTF之[GXYCTF2019]BabySQli

它傳回了wrong pass!就表示可以進行下一步了。

接下來就是套路化的操作了,先通過order by來确定有多少列

BUUCTF之[GXYCTF2019]BabySQli

發現order by被過濾了,試試看大小寫能不能繞過

BUUCTF之[GXYCTF2019]BabySQli

發現是可以的,是以:

  • name=admin’ oRder by 1 %23&pw=123456

    (正常顯示)

  • name=admin’ oRder by 2 %23&pw=123456

    (正常顯示)

  • name=admin’ oRder by 3 %23&pw=123456

    (正常顯示)

  • name=admin’ oRder by 4 %23&pw=123456

    (報錯顯示)

是以可以确認該表中隻有3列

那接下來就是爆破資料庫了,但是經過測試發現它把括号

()

給過濾掉了。這咋整???函數基本都是要加括号的。。。。

然後上傳找教程是說,這題可以通過

union

這個關鍵字建立虛拟表。

就好比我在自己的資料庫中有個test的表,表裡有6列。是以:

BUUCTF之[GXYCTF2019]BabySQli

然後再通過union關鍵字生成虛拟的資料:

BUUCTF之[GXYCTF2019]BabySQli

可以看到加上union關鍵字後會在第四行生成我們自己定義好的資料。為什麼說是虛拟的呢?因為union産生的資料是臨時的,在下次查詢的時候就會發現它不見了(因為它沒有實際儲存在資料庫中)。

而這題就是利用這個原理,一開始我們已經确定好了它的使用者名為:admin。但是它的密碼我們卻不知道,這時我們可以通過union來建立一個虛拟的資料,然後再通過SQL語句來查詢它。這樣它就能正常傳回值了。比如:

BUUCTF之[GXYCTF2019]BabySQli

是以原題目的payload可以改成:

但是卻發現還是不能拿到flag,問題何在???

BUUCTF之[GXYCTF2019]BabySQli

思路是對的,隻是出題方不想你這麼簡單的拿flag。是以密碼的那部分還加了md5加密。

正确的payload是:

name=1' union select 1,'admin','e10adc3949ba59abbe56e057f20f883e' %23&pw=123456

BUUCTF之[GXYCTF2019]BabySQli

其中的

e10adc3949ba59abbe56e057f20f883e

123456

經過MD5加密後的值。

這個123456和後面的

pw=123456

對應

總結: 不得不說,那些第一次靠自己做出來這道題的大佬是真的厲害。通過他們我又學到東西了

繼續閱讀