報錯型盲注原理分析

2021-08-17 16:03:12 字數 1079 閱讀 4413

眾所周知,盲注並不會返回錯誤資訊,使得sql注入的難度提高。而報錯型注入則是利用了mysql的第8652號bug :bug #8652 group by part of rand() returns duplicate key error來進行的盲注,使得mysql由於函式的特性返回錯誤資訊,進而我們可以顯示我們想要的資訊,從而達到注入的效果;當然其他型別的資料庫也存在相應的問題,在此我們不提。

原理剖析

bug 8652的主要內容就是在使用group by 對一些rand()函式進行操作時會返回duplicate key 錯誤,而這個錯誤將會披露關鍵資訊,如

"duplicate entry '####' for key 1"

這裡的####正是使用者輸入的希望查詢的內容

而該bug產生的主要原因就是:在rand()和group by同時使用到的時候,可能會產生超出預期的結果,因為會多次對同一列進行查詢

對這個bug的利用

顯然,我們需要巧妙地構造出能夠觸發上面這種型別報錯的語法,或者說是公式來有意地觸發bug。

通用的公式:

?id=1' union select 1,count(*),concat(你希望的查詢語句,floor(rand(0)*2))a from information_schema.columns group by a

在進行查詢時,sql會根據需要建立臨時表進行資料的儲存;

關於為什麼會報錯,官方介紹中說到,對同一列進行多次查詢,即rand多次執行,那麼我們可以猜測,當查詢第一條語句時,結果為0,可以知道在臨時表中鍵值為0不存在,因此我們會進行插入結果的操作,在插入之前猜測rand再次執行,因此插入了鍵值為1的結果

下乙個數:此時查詢到0,又因為不存在該值,因此我們又會進行插入結果的操作,繼續我們的猜測,在插入前進行rand的再次執行,因此想要插入值為1的新列,而值為1的列已存在,因此報錯(count()函式的特性)!

結論對於乙個整數x,對於floor(rand(x)*2)產生的序列,如果在未出現「0011」或「1100」序列前出現「0010「或」1101」,那麼該floor(rand(x)*2)產生的序列可用於報錯型sql盲注

參考

布林型盲注 時間型盲注

布林型盲注核心思想 利用判斷語句杢證明推測是否正確。推測正確時,頁面正常顯示 錯誤時,頁面異常。盲注的一般步驟 1 求閉合字元 2 求當前資料庫名的長度 3 求當前資料庫名對應的ascii值 4 求表的數量 5 求表名的長度 6 求表名對應的ascii值 7 求列的數量 8 求列名的長度 9 求列名...

函式報錯注入 盲注

即利用系統輸出的報錯資訊來進行注入 floor報錯注入 floor報錯注入應該是報錯注入中最為複雜的一種了 其中的基礎為下面這句話 1select count floor rand 0 2 x from security.users group by x 需要注意的時候floor後面的x為乙個別名,...

布林盲注 原理

布林盲注 可以寫指令碼 例如 沒有錯誤提示 也沒有回顯 但是輸入錯誤的話頁面會有反應 也就是說 只有 true 和false 例如 sql labs less 7 它只有兩種提示 所以可以用布林盲注 playload and length database 8 判斷資料庫名長度 是否等於8 如果不等...