当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 让你见识一下SQL Server口令的脆弱性

MSSQL
SQL Server--全文本检索的应用(一)
SQL 2005的SSIS与Oracle的迁移性能
SQL优化实例:从运行30分钟到运行只要30秒
无法在SQL Server2005 Manger Studio 中录入中文的问题
SQL Artisan多表查询和统计
SQL Server数据库开发人员在应聘时经常被问到哪些问题
一个完整的SQL SERVER数据库全文索引的示例
SQL Server安全之加密术和SQL注入攻击
如何对SQL Server中的tempdb“减肥”
SQL Server 2005升级的十个步骤
如何在SQL Server开发中融入极限编程技术
SQL Server应用程序高级SQL注入(下)
SQL Server应用程序高级SQL注入(上)
SQL Server连接中的常见错误
IIS中SQL Server数据库的安全问题
SQL Server 2005区域配置和安全工具
保护 SQL Server 的十个步骤
如何利用SQL Server 2000的复制选项
SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法
SQL SERVER 2005同步复制技术的应用

MSSQL 中的 让你见识一下SQL Server口令的脆弱性


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 59 ::
收藏到网摘: n/a

跟踪了一下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加秘KEY。

20个字节的HASH1。

20个字节的HASH2。

如我取出的一个例子:

fx:0x0100 1751857F DFDEC4FB618D8D18EBA5A27F615639F607CD46BE DFDEC4FB618D8D18EBA5A27F615639F607CD46BE固定 补充KEY HASH1 HASH2口令是:123456

SQL首先用4个字节的HASH加秘KEY补上其两处口令的缓冲,一个为大写,一个为小写。然后其加密过程如下C函数: