天天看點

CTF-Web2-(簡單繞過登入過濾)2.登陸一下好嗎??方法二:利用mysql的資料類型轉換特性繞過

2.登陸一下好嗎??

CTF-Web2-(簡單繞過登入過濾)2.登陸一下好嗎??方法二:利用mysql的資料類型轉換特性繞過

做CTF題時,不要忽略任何資訊,要先收集資訊,再分解資訊,對于出題者的資訊,不可全信,也不可不信,具體的來說就是要仔細分析,出題者的意圖。

那麼,根據這一題的資訊,我們了解到這是一道過濾了某些字元的登入注入題型,為了進一步了解點選連結開始答題:

CTF-Web2-(簡單繞過登入過濾)2.登陸一下好嗎??方法二:利用mysql的資料類型轉換特性繞過

打開連結,我們就能看到一個很簡單的一個登入頁面,我們可以按F12檢視前端代碼,看是否有隐藏的資訊,結果沒有,接下來我們就要考慮給出的資訊中提到過濾了一切,我們測試一下,看是否過濾了所有的字元:

CTF-Web2-(簡單繞過登入過濾)2.登陸一下好嗎??方法二:利用mysql的資料類型轉換特性繞過

點選登入:

CTF-Web2-(簡單繞過登入過濾)2.登陸一下好嗎??方法二:利用mysql的資料類型轉換特性繞過

從傳回的資訊中我們了解到:1.沒有過濾的字元有and  單雙引号' " (注:其他字元自行測試,and關鍵字通常與select關鍵字連用才能發揮真正的效果,單獨使用and和引号對于SQL注入來說局限性很大)2.我們輸入的使用者名和密碼都會顯示在點選按鈕後的頁面上,通過其傳回的資訊我們大緻可推斷出SQL語句為

select * from user where username='$_POST[username]' and password='$_POST[password]'  //單引号字元型注入
           

(注:這隻是推測,也有可能是雙引号字元型注入,還有可能帶上括号什麼的,不過一般單引号居多,是以先從單引号入手)

接下來我們就要開始注入了,隻要我們滿足條件為'真',就可以傳回正确的使用者名和密碼了,而這道題過濾了很多的字元,怎樣才能注入成功呢?

方法一:雙等号繞過

在框中輸入 '='

CTF-Web2-(簡單繞過登入過濾)2.登陸一下好嗎??方法二:利用mysql的資料類型轉換特性繞過

那麼SQL語句就變成了

select * from user where username=' '=' ' and password=' '=' ' 

也就是select * from user where username=null=null and password=null=null

根據SQL語句的等号的運算規則,我們從左往右來了解這句sql語句,首先usename=' ' 一般資料庫是沒有null這個使用者名的是以usename=null判斷為false然後usename=false=null接着 false=null 傳回true 于是 select * from user where username=true and password=' '=' ' 同理password也為true

那麼整個SQL語句就變成了select * from user where username=true and password=true 根據SQL語句的文法,該SQL語句可以簡寫成select * from user

(注: '='是最簡單的寫法,其他寫法還有:

1='1'

1='1.0'

1='1後接字母(再後面有數字也可以)'

0='除了非0數字開頭的字元串'

.....

(總體上隻要前面達成false的話,要使語句為true很簡單)

這裡我們可以使用 1'=' 來測試

CTF-Web2-(簡單繞過登入過濾)2.登陸一下好嗎??方法二:利用mysql的資料類型轉換特性繞過

點選按鈕之後:

CTF-Web2-(簡單繞過登入過濾)2.登陸一下好嗎??方法二:利用mysql的資料類型轉換特性繞過

我們就得到了我們想要的Flag,而且從下面的表單中我們看到有3個使用者,也就是說user表裡至少有3個使用者,因為不确定本關的SQL語句後面是否有limit 0,3 這樣的限制條件。

方法二:利用mysql的資料類型轉換特性繞過

這個方法是我參考别人的部落格發現的,很神奇竟然還有這種方法,遺憾的是沒有環境測試了,這裡我截取别人部落格的内容:(原部落格:https://blog.csdn.net/yalecaltech/article/details/63685280)

第一: mysql的資料類型轉換特性。 

CTF-Web2-(簡單繞過登入過濾)2.登陸一下好嗎??方法二:利用mysql的資料類型轉換特性繞過

     通過這個圖,應該可以看明白啦, user是一個字元串類型的,當他接受到一個整型值其值為0的時候,就會傳回資料庫的所有條目。 一個字元串加一個整形,會自動的變量類型轉換,變為一個整型。

是以,隻需要讓sql執行

select * from table where username='a'+0;

就可以傳回一個ture了,但是你會發現注釋符全部過濾啦,後面的部分去不掉,這時候你需要知道下面的姿勢。

第二: mysql的注釋符除了

-- + , # , 之外,還有一個 ;%00 ,很多人都不知道最後一個。

是以最後的payload 是這樣的: username=a'+0;%00&password= 

于是,整個SQL語句就變成了select * from user where username='a'+0;%00 and password= 

也就是select * from user where username='a'+0;

補充:這裡我來驗證上面的MySQL資料類型轉換特性:

CTF-Web2-(簡單繞過登入過濾)2.登陸一下好嗎??方法二:利用mysql的資料類型轉換特性繞過
CTF-Web2-(簡單繞過登入過濾)2.登陸一下好嗎??方法二:利用mysql的資料類型轉換特性繞過

不得不說能想到這個方法的人,真是牛!!