热门关键字:   网站安全  黑客攻防  安全漏洞  系统安全  网络安全
站外
广告
域名申请虚拟主机 信息安全 域名注册 云主机 网络安全技术 企业网络安全 站外
广告
文字广告位招租 文字广告位招租 文字广告位招租 文字广告位招租 云安全

深喉CMS密码加密简要解析

发布时间:2013-02-27 11:09文章来源:网络文章作者:upload 点击次数:
摘要:0x01 代码分析 php版加密函数所在文件路径 %wwwRoot%\Deepthroat\inc\class.shlencryption.php 代码(加了一点注释): ? php classshlEncryption { var$ enstr = null ; functionshlEncryption($str) { $this- enstr =$str; } functionget_shal() { returns...

0x01 代码分析

php版加密函数所在文件路径

%wwwRoot%\Deepthroat\inc\class.shlencryption.php

代码(加了一点注释):

  1. <?php 
  2. class shlEncryption 
  3. var $enstr = null
  4. function shlEncryption($str) 
  5. $this->enstr = $str; 
  6. function get_shal() 
  7. return sha1($this->enstr);//sha1加密,40位输出 
  8. function get_md5() 
  9. return md5($this->enstr);//md5加密,32位输出 
  10. function get_jxqy3() 
  11. $tmpMS = $this->get_shal().$this->get_md5();//输入值的sha1加密值(40)+md5值(32) 
  12. //40+8+[a0+a1+...+a15]+8 
  13. $tmpNewStr = substr($tmpMS,0,9).'s'.substr($tmpMS,10,9).'h'.substr($tmpMS,20,9).'l'.substr($tmpMS,30,9).'s'.substr($tmpMS,40,9).'u'.substr($tmpMS,50,9).'n'.substr 
  14. ($tmpMS,60,9).'y'.substr($tmpMS,70,2);//替换10的整数倍上的字符为s、h、l、s、u、n、y 
  15. $tmpNewStr = substr($tmpNewStr,-36).substr($tmpNewStr,0,36);//前36位后36位倒转 12+16+8 
  16. $tmpNewStr = substr($tmpNewStr,0,70);//取前70位 
  17. $tmpNewStr = substr($tmpNewStr,0,14).'j'.substr($tmpNewStr,14,14).'x'.substr($tmpNewStr,28,14).'q'.substr($tmpNewStr,32,14).'y'.substr($tmpNewStr,56,14).'3'; 
  18. //在第15倍数位上的加上字符j、x、q、y、3 
  19. return $tmpNewStr;//返回 
  20. function to_string() 
  21. $tmpstr = $this->get_jxqy3(); 
  22. $tmpstr = substr($tmpstr,-35).substr($tmpstr,0,40);//最后35位+开始的40位 
  23. return $tmpstr; 
  24. ?> 

0x02 算法分析

这个加密过程,将明文(待加密的字符串)的md5及sha1值进行拼接、组合、截取、换位,最后得到密文。这样在加密的时候,我们就基本了解了整个过程了。

从中,我们看的出,在知道算法的情况下,如果只采取换位的操作,我们是可以得解密出明文的(所有信息没有损耗,专业的说法是信息熵没有改变);但是,如果采取了替换的操作,那么,情况不一样了。因为一旦有替换的话,密文的信息量就会发生改变。譬如ABC做换位的话只会有6种可能,如果使用替换,将C替换为D,那么密文变成了ABD,其中C这个信息就不存在了,解密的时候这个D就只能是枚举可能或者其他规律中寻找了。

回到我们的cms中,我们注意到使用了md5加密,而且是32位的,那么我们是不是可以追踪这32位的数据,看加密过程中,这32位发生了什么改变不就可以了?

这里我们又想到32位的数据比较多,而这个32位的md5其实是可以转化成16位的(其实16位是32位字符串的子串,为第9位到25),好了,到这里,我们的目标明确了,我们追踪这个16个字符串,看在整个字符串加密的过程中,发生了怎么样的变化。

将0x01改下成如下代码,以便分析:

 

  1. <?php 
  2. var $enstr = 'admin'
  3. var sha1sha1str=sha1($enstr); //sha1加密,40位输出 
  4. var md5md5str=md5($enstr); 
  5. $tmpMS = sha1str.md5str;//输入值的sha1加密值(40)+md5值(32) 
  6. echo "第一步,合并:".$tmpMS."\r\n"; 
  7. $tmpNewStr = substr($tmpMS,0,9).'s'.substr($tmpMS,10,9).'h'.substr($tmpMS,20,9).'l'.substr($tmpMS,30,9).'s'.substr($tmpMS,40,9).'u'.substr($tmpMS,50,9).'n'.substr 
  8. ($tmpMS,60,9).'y'.substr($tmpMS,70,2);//替换10的整数倍上的字符为s、h、l、s、u、n、y 
  9. echo "第二步,替换:".$tmpNewStr."\r\n"; 
  10. $tmpNewStr = substr($tmpNewStr,-36).substr($tmpNewStr,0,36);//前36位后36位倒转 
  11. echo "第三步,换位:".$tmpNewStr."\r\n"; 
  12. $tmpNewStr = substr($tmpNewStr,0,70);//取前70位 
  13. echo "第三步,截取:".$tmpNewStr."\r\n"; 
  14. $tmpNewStr = substr($tmpNewStr,0,14).'j'.substr($tmpNewStr,14,14).'x'.substr($tmpNewStr,28,14).'q'.substr($tmpNewStr,32,14).'y'.substr($tmpNewStr,56,14).'3'; 
  15. echo "第四步,添加:".$tmpNewStr."\r\n"; 
  16. $tmpstr = $tmpNewStr; 
  17. $tmpstr = substr($tmpstr,-35).substr($tmpstr,0,40);//最后35位+开始的40位 
  18. echo “最后结果".$tmpstr."\r\n"; 
  19. ?> 

执行:

第一步,合并:d033e22ae348aeb5660fc2140aec35850c4da99721232f297a57a5a743894a0e4a801fc3

第二步,替换:d033e22aes48aeb5660hc2140aec3l850c4da99s21232f297u57a5a7438n4a0e4a801yc3

第三步,换位:a99s21232f297u57a5a7438n4a0e4a801yc3d033e22aes48aeb5660hc2140aec3l850c4d

第三步,截取:a99s21232f297u57a5a7438n4a0e4a801yc3d033e22aes48aeb5660hc2140aec3l850c

第四步,添加:a99s21232f297uj57a5a7438n4a0ex4a801yc3d033e2q1yc3d033e22aesyc2140aec3l850c3

最后结果:33e2q1yc3d033e22aesyc2140aec3l850c3a99s21232f297uj57a5a7438n4a0ex4a801yc3d0

我们可以看出:

第一步中,合并中,字符串没有收到影响[字符串中的]

第二步中,替换中,字符串的第二位被替换成"u",字符串第12位被替换成"n"

第二步中,换位,字符串的位置发生改变

第三步中,截取,对字符串无影响

第四步中,添加,对字符串无影响,字符串的位置发生改变

第五步中,输出前换位,字符串的位置发生改变

那么,本质上,这16位的字符串,改变了两位:第2位,第12位

且知道,16位就存在密文中的48,49(u),50-59,60(n),61,62.63.64

那么我们,如果知道了密码加密后的75位密文后,就可以确定其中的14位了,那么剩下的可能性就只有两位了,剩下也就36*36种已知可能了

0x03 验证

现在,在cms中修改密码为‘wooyun,查看数据库,密码加密过后为

930eq1yfbc9930e156sy2e62d54fbl601b3617sfbb204a40uj1ffbd4128na84cx258c1yfbc9

取出其中的48,49(u),50-59,60(n),61,62.63.64位

0u1ffbd4128na84cx

而字符串‘wooyun’的md(16位值为

061ffbd41284a84cx

正好符合0x02中分析

0x04 总结

由于笔者仅能注意到这个算法中的md5字符串在加密过程中的变化情况,最后解密该cms密码加密后的字符串,可以取出其中的48,49(u),50-59,60(n),61,62.63.64位,然后,将u,n所在位分别替换成其他的0-9或者a-z,构成合法的md5值,进行md5破解即可。

当然,这个加密的字符串中包含了其他的信息是笔者无法利用的,如果大牛们有其他看法,望不吝赐教

标签分类:

上一篇:DedeCms密码解密
下一篇:一个关于加密算法的简单讨论帖子