DVWA SQL Injection 報錯注入

2022-09-19 21:03:11 字數 3493 閱讀 7874

我當前的理解,報錯注入主要是用於無正常回顯但是存在異常回顯時;比如 sql 語句執行正常時頁面只給你彈出操作成功;但是執行失敗時卻會告知你失敗的資訊(通過提示框或者偵錯程式中的注釋輸出等)

本篇報錯注入的學習以 dvwa sql injection 為例,這個題正常回顯與異常回顯都有,本次我們不去看它存在的正常回顯,利用異常回顯實現注入

這個函式是 mysql 用於實現 xml 檔案的替換更新,主要涉及到三個引數:第乙個引數是 xml 文件物件,第二個引數是用於定位的 xpath 語句,第三個引數是要替換的新值;

關鍵的報錯點在 xpath 語句那裡,xpath 語句可以使用 sql 語句進行拼接,拼接後檢查是否符合 xpath 語法,不符合的話會報錯輸出,常用的誘發元素為~0x7e

這時按照之前的步驟就能爆破出最後的內容了,注意我們的爆破點是位於concat函式內部的子查詢,這裡只能返回一行資料,通常我們使用group_concat合併多行結果即可,但是 updatexml 的報錯只支援 32 位,因此最好一行一行的使用concatlimitsubstring逐個爆破

長度為 31 是因為開頭有個~

該函式與 updatexml 類似,也是利用的 xpath 解析錯誤實現的報錯注入,只不過乙個類似於 get 方法從 xml 文件中利用 xpath 提取目標內容;另乙個類似於 set 方法從 xml 文件中利用 xpath 定位目標內容並替換;

extractvalue 第乙個引數為 xml 文件物件,第二個引數為 xpath 語句,其利用如下:

2、資料獲取

?id=1' and extractvalue(1, concat(0x7e, 

substring(

(select group_concat(user, '|', password) from dvwa.users), 31, 31

))) -- -

依舊是存在 32 位顯示問題

主要利用substring手動解決

floor 函式使用於返回小於等於括號內該值的最大整數

原理:rand 偽隨機函式與 order by 或 group by 函式的衝突:例如 floor(rand() * 2) 一開始計算得到了 0,group by 根據 0 分類統計,在寫入要返回的虛表時 floor(rand() * 2) 還要計算一次結果,這次結果卻是 1 ,這樣就可能導致衝突

利用:floor(rand(0) * 2) 產生的隨機數固定為01101

1、一開始得到 0 虛表中沒有 0 這一項,需要插入 key = floor(rand(0) * 2) value = 1 這一項,插入時 rand 重新計算得到 1,誤插入了 (1, 1) 而非 (0,1);

2、繼續 rand(0) 計算得到 1 這時存在 key = 1 的項,value + 1 即可;

3、繼續 rand(0) 計算得到 0 這時不存在 key = 0 的項,需要插入 key = floor(rand(0) * 2) value = 1,rand 重新計算得到了 1,又插入了 (1, 1) 這一項,鍵值衝突,報錯!

tips:以 rand(0) 為基礎的 payload 需要至少三條資料項才能實現報錯注入

1、簡單的檢測下報錯注入是否成功:注入成功

?id=1'+union+select+count(*),+concat(floor(rand(0)*2), 0x7e, database())+x+from+information_schema.tables+group+by+x+--+-
2、注入成功後只需要將 payload 替換即可:很明顯這個報錯回顯也存在長度限制:62 位

?id=2'+union+select+count(*),+concat(floor(rand(0)*2), 0x7e, (select group_concat(user, '|', password) from dvwa.users))+x+from+information_schema.tables+group+by+x+--+-
3、利用 substring 與 limit 即可

exp 函式報錯的本質是溢位報錯,該函式會在傳入值大於 710 時產生溢位,因此利用子查詢預設返回值為 0 與取反操作即可得到乙個讓 exp 溢位的極大值,並利用報錯執行了子查詢內容獲得了有意義的回顯值

?id=1' and exp(~(select * from (select user())x)) -- -
並且報錯回顯不存在長度限制,比較方便:

但是在 5.7 版本以上已經被修復了,本例是在 mysql-5.5.29 復現成功,在 mysql-5.7.26 復現失敗:下圖為失敗效果,payload 執行失敗

mysql注 MySQL手注之報錯注入

報錯注入 指在頁面中沒有乙個合適的資料返回點的情況下,利用mysql函式的報錯來創造乙個顯位的注入。先來了解一下報錯注入常用的函式 xml 指可擴充套件標記語言被設計用來傳輸和儲存資料。concat 返回結果為連線引數產 的字串 報錯注入常用的函式 extractvalue 對xml文件進行查詢的函...

函式報錯注入 盲注

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

報錯型盲注原理分析

眾所周知,盲注並不會返回錯誤資訊,使得sql注入的難度提高。而報錯型注入則是利用了mysql的第8652號bug bug 8652 group by part of rand returns duplicate key error來進行的盲注,使得mysql由於函式的特性返回錯誤資訊,進而我們可以顯...