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

SQL Server 暴力破解 sa 密碼預存程式碼分析與效能優化

     編輯:關於SqlServer

⚠️ 安全警示

本文僅供安全研究、滲透測試授權範圍內、或遺忘密碼自救 參考。未經授權嘗試破解他人資料庫帳密屬違法行為,嚴禁用於非法用途。生產環境請採用強密碼、帳號鎖定策略、稽核登入失敗、最小權限原則等防禦措施。

核心原理

  • 系統表 master.dbo.sysxlogins 儲存登入帳號與密碼雜湊。
  • 未文件化函數 PWDCOMPARE(明文, 雜湊, 類型) 可比對密碼是否正確(回傳 1 表吻合)。
  • 暴力破解即:窮舉字元組合 → 呼叫 PWDCOMPARE → 找出匹配者。

原始版本程式碼(節錄關鍵邏輯)

ALTER PROC p_GetPassword
    @username SYSNAME = NULL,
    @pwdlen INT = 2
AS
BEGIN
    -- 建立 256 字元查表暫存表 #t (char(0)~char(255))
    -- 建立目標帳號暫存表 #pwd
    -- 逐位數窮舉:1 字元 → 2 字元 → ... → @pwdlen 字元
    -- 每輪動態 SQL UPDATE #pwd SET ... WHERE PWDCOMPARE(組合字串, password, type)=1
    -- 最後輸出破解成功的帳號、密碼、ASCII 碼
END

字元集:256 個 ASCII 字元(含不可列印字元),理論可破解 7 位密碼(256^7 < MAX_BIGINT)。

優化版本改進重點

項目原始版優化版
字元集256 全 ASCII66 個鍵盤可見字元 (a-z, 0-9, 符號)
暫存表結構IDENTITY INTCHAR(1) PRIMARY KEY CLUSTERED
動態 SQL 組裝CHAR() 函數直接串接字元常值,減少函數呼叫
效能統計無每輪列印預估比對筆數 (rows)
理論最大長度7 位10 位 (66^10 < MAX_BIGINT)
純數字密碼不支援10^19 < MAX_BIGINT → 理論 19 位

優化版關鍵程式碼片段

DECLARE @ss VARCHAR(256) = 'abcdefghijklmnopqrstuvwxyz`0123456789-=[]\;,./~!@#$%^&*()_+{}|:<>?';
-- 建立 #t(c CHAR(1) PRIMARY KEY CLUSTERED) 填入 @ss 每個字元

-- 首輪:1 字元
SET @s1 = 'aa.c', @s2 = 'CAST(ASCII(aa.c) AS VARCHAR)', @s3 = ',#t aa';
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');

-- 後續輪次迴圈遞增 @l,動態增加 JOIN 與字元串接
WHILE EXISTS(SELECT 1 FROM #pwd WHERE jm=0 AND @l < @pwdlen)
BEGIN
    SET @l += 1;
    -- 組裝下一輪 JOIN 別名 (aa, ab, ac...) 與字元串接
    EXEC(...);
END

實測結果範例

EXEC p_GetPassword2 'b', 6;
-- 輸出
用戶名 密碼 密碼ASCII       查詢次數和行數
b      123  49,50,51       1th,66rows;2th,4356rows;3th,287496rows

防禦建議

  1. 強密碼策略:長度 ≥ 12、大小寫數字符號混合、定期輪換。
  2. 帳號鎖定:LOGON TRIGGER 或群組原則記錄失敗次數並暫時封鎖。
  3. 稽核登入失敗:SERVER AUDIT 或錯誤日誌監控異常登入嘗試。
  4. 最小權限:避免應用程式直接使用 sa,建立專用低權限登入。
  5. 網路層隔離:資料庫埠僅對應用伺服器開放,禁止直接暴露網際網路。

結語

暴力破解本質是指數級窮舉,字元集縮小與長度限制是關鍵防線。DBA 應著重於預防而非事後追查;若需恢復遺忘密碼,請參考 -m 單一使用者模式重設密碼(見文章 72235),遠比破解安全合法。

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