由于要使用到基于時間的盲注,但是我覺得基于時間的盲注其實就是基于布爾的盲注的升級版,所以我想順便把基于布爾的盲注分析總結了;
首先我覺得基于時間的盲注和基于布爾的盲注的最直觀的差别就是“參照物”不同,也就是說基于布爾的盲注,其實是可以通過頁面的一些變化來進行判斷結果!但是有的時候,執行一些sql語句的測試,頁面不會有像布爾盲注的時候比較直觀的變化,所以這個時候所謂的基于時間的盲注,也就是在基于布爾的盲注上結合if判斷和sleep()函數來得到一個時間上的變換延遲的參照,也就可以讓我們進行一些判斷。
0x01獲取數據庫名的長度
-構造的sql語句:1’ and (length(database()))> 5#
-分析:因為and後面的表達式運算的結果是bool,保證and前面的結果為真的前提下,就可以通過後面的表達式返回的bool結果來判斷猜測是否正确database()這個函數的作用是獲取當前的數據庫名,但是我們并不能看到,所以需要通過length()函數去獲取這個數據庫名字的長度,通過這個長度去和我們指定的一個數比較,那麼隻要最後的結果為真,那就可以得到數據庫名字的長度
① 200多本網絡安全系列電子書
② 網絡安全标準題庫資料
③ 項目源碼
④ 網絡安全基礎入門、Linux、web安全、攻防方面的視頻
⑤ 網絡安全學習路線
⑥ 私信“安全”即可白嫖
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的數據庫
那麼對于表的數量,表名字的長度,以及列的相關内容和數據的相關内容,根據我前面的總結都可以使用類似的方式去推理得到,隻是有點繁瑣
關于今天的盲注的學習就到此結束!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!