通過逆向分析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 (純數字密碼大小寫相同),洩露「密碼無字母」信息。
CryptAcquireContext 獲取 Provider Handle (Microsoft Base Cryptographic Provider v1.0)。CALG_SHA1 = 0x8004)。CryptHashData:CryptGetHashParam 取出兩個20字節哈希拼接存儲。| 層面 | 缺陷 | 影響 |
|---|---|---|
| 網絡傳輸 | 可逆弱加密,無會話金鑰 | 中間人/抓包即得明文 |
| 存儲哈希 | 雙哈希拼接,實際熵僅20字節 | 暴力破解空間減半;HASH1=HASH2洩露字符集信息 |
| 鹽值 | 4字節KEY固定/可預測 | 彩虹表預計算可行 |
| 算法 | SHA1已棄用 (碰撞攻擊) | 不符合現代合規要求 |
下篇將詳細分析哈希碰撞攻擊可行性與離線破解工具鏈構建。