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

SQL Server密碼安全性深度剖析:網絡傳輸與存儲加密的脆弱性(上)

     編輯:關於SqlServer

通過逆向分析SQL Server登錄協議(TDS),發現其網絡傳輸加密與服務端存儲哈希均存在嚴重脆弱性。本文僅供安全研究與防禦加固參考,嚴禁用於非授權攻擊。

一、網絡登錄密碼加密算法極弱 (可逆)

登錄TDS包處理流程中,密碼字段經簡單位運算「加密」:

; 反彙編核心邏輯 (地址 0065C880)
mov cl, [edi]       ; 取明文字節
mov dl, cl
xor cl, 5           ; cl ^= 0x05
xor dl, 0AFh        ; dl ^= 0xAF
shr dl, 4           ; dl >>= 4
shl cl, 4           ; cl <<= 4
or dl, cl           ; 合併
mov [edi], dl       ; 寫回密文字節
inc edi
dec eax
jnz loop

等效C代碼:

void sqlpasswd(char *enc, char *dec) {
    for (int i=0; i<128 && enc[i]; i++) {
        unsigned char a1 = (enc[i] ^ 5) << 4;
        unsigned char a2 = (enc[i] ^ 0xAF) >> 4;
        dec[i] = a1 | a2;
    }
    dec[i] = dec[i+1] = 0;
}

結論:無鹽、無金鑰、可逆線性變換,**等同明文傳輸**。抓包工具嵌入解密代碼即可還原密碼。0xA5非分隔符,僅是0x00加密後產物。

二、服務端存儲哈希結構異常

從 master..syslogins / sys.sql_logins 讀取的 password 列結構:

0x0100 | 4字節KEY | 20字節HASH1(小寫密文) | 20字節HASH2(大寫密文)
示例 (密碼=123456):
0x0100 1751857F DFDEC4FB618D8D18EBA5A27F615639F607CD46BE
        DFDEC4FB618D8D18EBA5A27F615639F607CD46BE

觀察:HASH1 == HASH2 (純數字密碼大小寫相同),洩露「密碼無字母」信息。

三、哈希生成流程 (CryptoAPI)

  1. CryptAcquireContext 獲取 Provider Handle (Microsoft Base Cryptographic Provider v1.0)。
  2. 創建兩個 Hash Handle (CALG_SHA1 = 0x8004)。
  3. CryptHashData:
    Hash1 = SHA1( 小寫密碼(6字節) + 4字節KEY )
    Hash2 = SHA1( 大寫密碼(6字節) + 4字節KEY )
  4. CryptGetHashParam 取出兩個20字節哈希拼接存儲。

四、安全缺陷總結

層面缺陷影響
網絡傳輸可逆弱加密,無會話金鑰中間人/抓包即得明文
存儲哈希雙哈希拼接,實際熵僅20字節暴力破解空間減半;HASH1=HASH2洩露字符集信息
鹽值4字節KEY固定/可預測彩虹表預計算可行
算法SHA1已棄用 (碰撞攻擊)不符合現代合規要求

防禦建議

  1. 強制加密連接:配置強制 TLS 1.2+,禁用明文/弱加密 TDS。
  2. 禁用 SQL 認證:改用 Windows 驗證 / Azure AD / 含 MFA 的方案。
  3. 審計登錄失敗:啟用失敗登錄審核,配合 SIEM 告警暴力破解。
  4. 升級版本:SQL Server 2012+ 引入更強哈希 (SHA2-512 + 高熵鹽),但網絡層仍需 TLS 保護。

下篇將詳細分析哈希碰撞攻擊可行性與離線破解工具鏈構建。

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