2.登陸一下好嗎??

做CTF題時,不要忽略任何資訊,要先收集資訊,再分解資訊,對于出題者的資訊,不可全信,也不可不信,具體的來說就是要仔細分析,出題者的意圖。
那麼,根據這一題的資訊,我們了解到這是一道過濾了某些字元的登入注入題型,為了進一步了解點選連結開始答題:
打開連結,我們就能看到一個很簡單的一個登入頁面,我們可以按F12檢視前端代碼,看是否有隐藏的資訊,結果沒有,接下來我們就要考慮給出的資訊中提到過濾了一切,我們測試一下,看是否過濾了所有的字元:
點選登入:
從傳回的資訊中我們了解到:1.沒有過濾的字元有and 單雙引号' " (注:其他字元自行測試,and關鍵字通常與select關鍵字連用才能發揮真正的效果,單獨使用and和引号對于SQL注入來說局限性很大)2.我們輸入的使用者名和密碼都會顯示在點選按鈕後的頁面上,通過其傳回的資訊我們大緻可推斷出SQL語句為
select * from user where username='$_POST[username]' and password='$_POST[password]' //單引号字元型注入
(注:這隻是推測,也有可能是雙引号字元型注入,還有可能帶上括号什麼的,不過一般單引号居多,是以先從單引号入手)
接下來我們就要開始注入了,隻要我們滿足條件為'真',就可以傳回正确的使用者名和密碼了,而這道題過濾了很多的字元,怎樣才能注入成功呢?
方法一:雙等号繞過
在框中輸入 '='
那麼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'=' 來測試
點選按鈕之後:
我們就得到了我們想要的Flag,而且從下面的表單中我們看到有3個使用者,也就是說user表裡至少有3個使用者,因為不确定本關的SQL語句後面是否有limit 0,3 這樣的限制條件。
方法二:利用mysql的資料類型轉換特性繞過
這個方法是我參考别人的部落格發現的,很神奇竟然還有這種方法,遺憾的是沒有環境測試了,這裡我截取别人部落格的内容:(原部落格:https://blog.csdn.net/yalecaltech/article/details/63685280)
第一: 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資料類型轉換特性: