SQL基於時間的盲注過程


0x00 前言

由於要使用到基於時間的盲注,但是我覺得基於時間的盲注其實就是基於布爾的盲注的升級版,所以我想順便把基於布爾的盲注分析總結了;

首先我覺得基於時間的盲注和基於布爾的盲注的最直觀的差別就是“參照物”不同,也就是說基於布爾的盲注,其實是可以通過頁面的一些變化來進行判斷結果!但是有的時候,執行一些sql語句的測試,頁面不會有像布爾盲注的時候比較直觀的變化,所以這個時候所謂的基於時間的盲注,也就是在基於布爾的盲注上結合if判斷和sleep()函數來得到一個時間上的變換延遲的參照,也就可以讓我們進行一些判斷。

0x01 獲取數據庫名的長度

-構造的sql語句:1’ and (length(database()))> 5#
-分析:因為and后面的表達式運算的結果是bool,保證and前面的結果為真的前提下,就可以通過后面的表達式返回的bool結果來判斷猜測是否正確 database()這個函數的作用是獲取當前的數據庫名,但是我們並不能看到,所以需要通過length()函數去獲取這個數據庫名字的長度,通過這個長度去和我們指定的一個數比較,那么只要最后的結果為真,那就可以得到數據庫名字的長度

0x02 獲取數據庫名字

- 得到數據庫名的長度過后,那就可以繼續去得到數據庫的具體名字,同樣也是通過bool結果去判斷

-構造的sql語句: 1‘ and (ascii(substr(database(),n,1)))>m #

 

分析:得到了數據庫名字的具體長度,database()可以獲得數據庫的名字(只是無法看到),那就可以通過database()函數獲得數據庫名字過后,再通過substr()函數去處理這個數據庫名字字符串substr(database(),n,1) 第一個參數是數據庫名字,第二個參數是開始截取的字符的位置(從1開始計算),最后一個參數是截取的字符的長度。由於是想要通過bool去判斷這個截取出來的具體字符是什么,所以還需要將截取出來的字符使用ascii()函數將字符轉換為ascii編碼的數值,然后再通過這個數據去和一個數比較,通過分別改變截取的起始位置和后面對比的數字,最后就可以把具體的數據庫名字猜解出來

0x03 獲取表的數量

-得到數據庫表明過后,接下來就可以去獲取我們查找到的數據庫的表的數量

 

-構造的sql語句:1' and (select count(*) from information_schema.tables where table_schem=database())>5#

 

分析:同樣也是通過最后的bool結果的真假來得到表明的數量

select count(*) from information_schema.tables where table_schem=database()

這條sql語句的作用就是從數據庫information_tables里面的tables表找到table_schem字段為database()的記錄的總數,也就是可以通過這個語句得到database()這個數據庫里面的表的總數,因為information_schema這個數據庫里面存放了所有mysql數據庫服務器的相關信息,這個數據庫里面的tables表里面就是存放的數據庫管理系統中所有數據庫的表的信息。最后得到表的數量過后,就使用這個數量結果去和一個數進行比較,那么通過對這個比較的數進行改變,就可以猜解出來這個數據庫的表的數量是多少;可以通過二分法的方式進行查找

0x04 獲取表名長度

-構造的sql語句:

1’ and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>5#

分析:由於一個數據庫 里面創建了許多張表,所以我們需要利用limit 0,1這個命令相結合,每次只取一個表去做計算,對於其他的表以此類推;

0x05 獲取表名字

- 得到表名的長度過后,,就需要利用asscii()函數去得到表名的每一個字符的ascii嘛,從而得到我們想要的表名

構造的sql語句:1‘ and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),0,1)))>100

 

分析:從information_schema的tables表中的table_schema字段等於database()的所有記錄中取出第一行記錄的 table_name字段的值;

然后利用取出的這個值使用substr()函數分別得到表名的每個字符,然后再通過ascii()去計算這個ascii碼,由於我們看不見這個ascii碼是多少,由於我們能夠知道布爾結果,所以就用這個計算出的ascii碼去和一個數進行比較,從而可以判斷出具體的ascii碼是多少,也就知道了對應的字符是什么。從而猜解出數據庫的表名

0x06 獲取列名個數,列名長度,列名

- 得到數據庫的表名過后,那下一步我們就想獲得對應表名的列名,也就是字段名字,那么這個時候我們就需要到information_schema數據庫里的columns表里面去查詢所有的表的列名相關的信息,那么獲取列名的步驟也和前面的原理一樣,先猜解列名的個數,獲取列名的長度,然后通過獲得的長度再去猜解列名

構造的sql語句:

1’ and (select count(*)from information_schema.columns where table_name=‘user’)>5#

 

構造的sql語句:

1’ and (select length(column_name)from information_schema.columns where table_name=‘user’ limit 0,1)>5#

 

構造的sql語句:

1’ and (ascii(substr((seclect columns_name from information_schema.columns where table_name='user' limit 0,1),1,1)))>100#

0x07 獲取數據

- 獲取數據,原理同前面一樣
構造的sql語句:1‘ and (ascii(substr(( select password from users limit 0,1),1,1)))=68#

0x08 基於時間盲注的要點

通過對上面的分析,我認為使用基於時間的盲注的時候,就可以將上面的構造的sql語句進行這樣的變化,如下:

and if((length(database())>5),sleep(5),0)

其實也就是通過length(database())>5 返回的布爾值,然后造成時間上的延遲來判斷結果,如果數據名的長度大於5是成立的,那么sleep(5)這個函數就會起作用,能夠讓我們感覺到返回一個頁面的時間上發生了變化,通過這個變化我們就能知道我們的判斷對不對。

0x09 實戰演練

1通過參數提交,無論怎樣的參數,頁面都不發生任何變化,都是同一個頁面

 

 

 

2、由於頁面沒有發生任何變化,無法做出有效判斷,所以試試基於時間的盲注

構造的語句:2' and if(1=1,sleep(5),0)--+

 

 

 

通過前后對比,可以斷定是存在sql注入的,因為時間上的變化可以確定我們構造的sql語句被帶入了數據庫執行,只是我們無法直觀的看到,只能通過sleep函數來對時間上的變化造成影響,以作為我們的參照點,判斷出我們想要的結果。

 

2、根據前面對布爾型注入和時間盲注的共同點分析,接下倆開始構造sql語句來猜解數據庫名字的長度和名字

構造的sql語句:2' and if((length(database())>5),sleep(5),0)--+

判斷數據庫的名字是不是大於5.如果大於5,就執行sleep函數,通過查看時間知道sleep是否執行,如果被執行,那么繼續改變5這個值,直到不再執行sleep

 

當我改到7的時候:

 

 

 

當我改到8的時候:

 

 

 

通過對比發現,當7的時候條件成立,8的時候條件不成立,也就是說數據庫的長度是大於7不大於8,那長度又只能是整數,所以最后我們就成功的判斷出當前的數據庫的長度就是8

那我們可以將>8換成=8來驗證一下:

2' and if((length(database())=8,sleep(5),0)--+

 

 

 

3、既然數據庫名字的長度猜解出來了,下一步就同樣使用時間盲注的方式來猜解數據庫的名字

構造的sql語句如下:

2' and if(((ascii(substr(database(),m,1)))>n),sleep(5),0)--+

那么這句參數里的m,n這兩個地方就是我們進行盲注的時候需要改變它們的值來測試的

m代表的是從數據庫名字這個字符串的第一位開始,m變化的范圍就是我們前面一部得到的數據庫長度的大小:8;

n’代表的就是我們需要用來對比我們截取的字符的ascii碼值的一個參考值,通過這個值的變化來最終確定我們截取的字符的ascii碼值是多少,從而得到數據庫名字的第一個字符

具體的操作如下:

100時:執行sleep

 

 

 

110時:執行sleep

 

 

115時:沒執行sleep

 

 

進一步確定范圍,數據庫名的第一個字符的ascii碼值的范圍在110-115之間

那么繼續更改;

112、113、114時:執行sleep

 

 

 

所以最后就很容易得到結果是:115,所以其對應的字符為:s

 

4、那么對於這個數據庫名字的其他字符,也是通過這個方法一步步去猜解,最后就得到了我們想要的數據庫名

結果是:security

通過我的數據庫去驗證一下,發現數據庫里面確實有一個名字叫做security的數據庫

 

 

那么對於表的數量,表名字的長度,以及列的相關內容和數據的相關內容,根據我前面的總結都可以使用類似的方式去推理得到,只是有點繁瑣

關於今天的盲注的學習就到此結束!


免責聲明!

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



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