国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

SQL SERVER數據庫口令的脆弱性

2024-08-31 00:49:35
字體:
來源:轉載
供稿:網友
中國最大的web開發資源網站及技術社區,
跟蹤了一下sql server數據庫服務器的登錄過程,發現口令計算是非常脆弱的,sql server數據庫的口令脆弱體現兩方面:

1、網絡登陸時候的口令加密算法

2、數據庫存儲的口令加密算法。

下面就分別講述:

1、網絡登陸時候的口令加密算法

sql server網絡加密的口令一直都非常脆弱,網上有很多寫出來的對照表,但是都沒有具體的算法處理,實際上跟蹤一下sql

server的登陸過程,就很容易獲取其解密的算法:好吧,我們還是演示一下匯編流程:

登錄類型的tds包跳轉到4126a4處執行:

004de72e:根據接收到的大小字段生成對應大小的緩沖區進行下一步的拷貝

004de748從接收到的tds buf偏移8處拷貝出login的信息

004de762:call sub_54e4d0:將新拷貝的緩沖壓入進行參數檢查的處理

依次處理tds包中的信息,各個字段氣候都應該有各個域的長度,偏移0x24處與長度進行比較。

下面這段匯編代碼就是實現對網絡加密密碼解密的算法:

.text:0065c880                 mov     cl, [edi]    .text:0065c882                 mov     dl, cl    .text:0065c884                 xor     cl, 5    .text:0065c887                 xor     dl, 0afh    .text:0065c88a                 shr     dl, 4    .text:0065c88d                 shl     cl, 4    .text:0065c890                 or      dl, cl    .text:0065c892                 mov     [edi], dl    .text:0065c894                 inc     edi    .text:0065c895                 dec     eax    .text:0065c896                 jnz     short loc_65c880    .text:0065c898                 jmp     loc_4de7e6


很容易就將其換成為c代碼,可以看出其加密及其簡單,和明文沒什么區別,呵呵,大家可以在sniffer中嵌入這段代碼對嗅嘆到的tds登陸包進行解密,其實0xa5不是特定的sql server密碼字段的分界符號,只是由于加密算法會自動把asc的雙字節表示的0x0加密成0xa5而已,但是如果允許雙字節口令,這個就不是判斷其分界的主要原因了。

void sqlpasswd(char * enp,char* dnp){    int i;    unsigned char a1;    unsigned char a2;    for(i=0;i<128;i++)    {        if(enp[i]==0)            break;        a1 = enp[i]^5;        a1 = a1 << 4;        a2 = enp[i]^0xaf;        a2 = a2 >> 4;        dnp[i]=a1|a2;    }    dnp[i]=0;    dnp[i+1]=0;    wprintf(l"passwd:%s/n",(const wchar_t *)dnp);}


2、數據庫存儲的口令加密算法

sql server的口令到數據庫存儲的加密方法,也是讓人怪異的。其過程如下:

在獲得網絡解密密碼的口令以后在005f9d5a處call sqlsort_14,實現一個轉換為大寫口令緩沖進行保存。

然后在004def6d處調用一個函數取出數據庫中的加密的password,其形式如下:

2個字節的頭0x0100(固定)  4個字節的hash加秘key20個字節的hash120個字節的hash2


如我取出的一個例子:

fx:0x0100 1751857f dfdec4fb618d8d18eba5a27f615639f607cd46be dfdec4fb618d8d18eba5a27f615639f607cd46be    固定    補充key   hash1                          hash2口令是:123456


sql首先用4個字節的hash加秘key補上其兩處口令的緩沖,一個為大寫,一個為小寫。然后其加密過程如下c函數:

cryptacquirecontextw(&hprov,null,l("microsoft base cryptographic provider v1.0"),1,0xf0000000);    cryptcreatehash(hprov,0x8004,null,null,&hhash);    cryptcreatehash(hprov,0x8004,null,null,&hhash);005f9dfe:    crypthashdata(hhash,passwdbuf,0x12,null);passwdbuf是小寫的passwd緩沖區,然后附加一個key,如上例子就是對    {'1','2''3''4''5''6',0x17,0x51,0x85,0x7f}這樣的一個字串進行hash加密    crypthashdata(hhash,passwdbuf,0x12,null);passwdbuf是大寫的passwd緩沖區,然后附加一個key 005f9e3e:    cryptgethashparam(hhash,2,&passwdout,&outlen,0);取出passwdbuf是小寫的passwd的加密值    cryptgethashparam(hhash,2,&passwdout,&outlen,0);


取出passwdbuf是大寫的passwd的加密值這兩個相加就是真正的數據庫中的password加密字段.

為什么說以上方法是脆弱的呢?其實其真正的加密長度生成只有20個字節。

小寫口令的hash1+大寫口令的hash1拼接的40位hash值的安全度還不如一個直接20位的hash值來得安全。因為大家都知道這兩個值的因果關系,

提供給了解密者更多的信息。

如因為其算法一樣,如果hash1=hash2,就可以判斷口令肯定是未使用字母,只使用了數字和符號的口令,如上取出的123456口令的hash,兩個hash完全相等。

就是使用了字母,其知道補充的key,算法,兩個加密字串的關系,其解應該也是大大的簡化了。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 芮城县| 炎陵县| 方城县| 台南市| 永德县| 攀枝花市| 郎溪县| 湖州市| 永修县| 通许县| 新郑市| 兰西县| 江津市| 汝城县| 虞城县| 上杭县| 南昌市| 安远县| 蒙山县| 尖扎县| 搜索| 清水县| 金昌市| 鹿泉市| 利津县| 英吉沙县| 乐亭县| 隆安县| 大化| 繁峙县| 石河子市| 潮安县| 泰来县| 左权县| 和田市| 湖州市| 长子县| 嘉义县| 运城市| 手机| 克拉玛依市|