文章目錄
- 前言
- 題目分析
- floor、rand、group by的恩怨情仇
- 細枝末節
- 總結
前言
??雖然上次你已經獲取了資料庫里的全部內容,但是并沒有找到大寶藏,不過你并沒有氣餒,這反而激起了你雄雄斗志,現在開始專門在網上找一些掛著中二宣傳詞的網站,有打著尋寶旗號的,有打著雞湯勵志的,也有打著……你覺得下面這個就很不錯,于是熟練的干起了老活計,
題目分析
首頁如下:

按提示輸入引數id后結果如下:

對此你非常淡定,畢竟你也是見過世面的不是?(雖然只見過一次)
你非常自信地輸入了一個單引號,結果如下:

竟然做了過濾,不過問題不大,只要沒有全部過濾,就總會找到突破口,接著你輸入了 " 、 ")等,當輸入 " 果然有反應了,結果如下:

因此右邊閉合符應為雙引號,
之后就是跟之前利用XPATH語法錯誤進行報錯注入一樣的操作了,但這次你決定玩點新花樣,extractvalue、updatexml雖好,但技多不壓身,這回你決定采用floor三件套,
寫入以下陳述句:
"and(select 1 from (select count(*) ,concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)- -+
結果如下:

可以看到,利用floor三件套同樣可以完成之前利用XPATH報錯機制進行注入的作業,那floor三件套的原理是什么呢?為什么利用floor三件套進行注入時得到的結果會多一個數字1出來呢?
floor、rand、group by的恩怨情仇
??要解決這些問題,就得好好剖析floor三件套中floor、rand、group by三者之間的關系了,三者的作用如下:
floor(x):對x向下取整;
rand(x):對x定義一個亂數;
count……group by x:以x為主鍵對表中欄位進行計數并生成另一張臨時表,
此外還需引入偽亂數的概念,所謂的偽隨機,就是在出現一段隨機序列后再次重復出現該序列,舉一個簡單的例子,Pi小數點部分任取一個數就是真正的亂數,因為Pi的小數隨機截取一段序列后無重復出現該段序列;而在序列111001110011100……中,無論如何截取,總會出現重復序列,因此由該段序列產生的數就是偽亂數,接下來就來看看三者是如何作用的,
floor(rand(0)*2)的作用就是產生偽亂數,其值在序列011011011……中產生,group by floor(rand(0)*2)執行機制為進行計數時:
如果插入記錄時第一次計算得到的的主鍵存在于臨時表中,則更新臨時表中的資料,此時僅count加一,不再計算rand的值;
如果插入記錄時第一次計算得到的主鍵不存在于臨時表中,則在臨時表中插入主鍵所在行的資料,此時除了count加一以外,還會再計算一次rand的值,
以下為執行程序:
當臨時表中插入第一條記錄時,floor(rand(0)*2)=0,臨時表中無該主鍵,因此floor(rand(0)*2)再執行一次后結果為1,并將該條記錄插入臨時表中,count加一;

當臨時表中插入第二條記錄時,floor(rand(0)*2)進行第三次計算,結果為1,此時臨時表中存在1的主鍵,因此floor(rand(0)*2)無須再次計算,僅count加一即可;

當臨時表中插入第三條記錄時,floor(rand(0)*2)進行第四次錦計算,結果為0,臨時表中不存在0的主鍵,因此floor(rand(0)*2)第五次執行,其結果為1,此時將在臨時表中插入一條主鍵為1的記錄,但已經有主鍵為1的記錄存在,此時主鍵沖突,產生報錯,

因此當floor、rand(0)、group by三者組合使用后,在插入第三條記錄時必定會因為主鍵重復而報錯
而報錯,
細枝末節
??在陳述句:and(select 1 from (select count(*) ,concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)- -+ 中,為了能夠進行嵌套查詢,采用了“SQL陳述句a”的形式,這里的a在之后使用時就代表了前面的SQL陳述句,另外加上陳述句“select 1 from”是為了解決and連接的是兩個邏輯結果的問題,而rand中的引數之所以選為0,是為了確保出現偽隨機序列011011……,如果將0換為其它數則不確定能否產生偽亂數,最終可能達不到主鍵沖突的結果,而我們得到的結果之所以有個數字1,也是因為主鍵1產生沖突報錯導致的,
總結
??在利用floor三件套進行報錯注入時,必須確保表中至少存在三條記錄,否則無法產生主鍵沖突;為了能夠產生偽亂數,rand的引數必須為0,
以上就是本篇的全部內容,我們下篇見,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/210812.html
標籤:其他
下一篇:關于jdbc連接資料庫出現The server time zone value ‘?й???????‘ is unrecogni
