SWPUCTF 关于mt_rand

我太菜了,做不出,赛后学习。


一、PHP伪随机mt_rand根据结果爆破种子

题目中源代码泄露

<?php
//生成优惠码
$_SESSION['seed']=rand(0,999999999);
function youhuima(){
  mt_srand($_SESSION['seed']);
    $str_rand = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $auth='';
    $len=15;
    for ( $i = 0; $i < $len; $i++ ){
        if($i<=($len/2))
              $auth.=substr($str_rand,mt_rand(0, strlen($str_rand) - 1), 1);
        else
              $auth.=substr($str_rand,(mt_rand(0, strlen($str_rand) - 1))*-1, 1);
    }
    setcookie('Auth', $auth);
}
//support
  if (preg_match("/^\d+\.\d+\.\d+\.\d+$/im",$ip)){
        if (!preg_match("/\?|flag|}|cat|echo|\*/i",$ip)){
               //执行命令
        }else {
              //flag字段和某些字符被过滤!
        }
  }else{
             // 你的输入不正确!
  }
?>

可以看出,根据session生成了一个种子,根据种子来生成1个15位的验证码,每次会生成一个0到strlen($str_rand)长度的随机数,然后前七位正数取字符,后8位倒数取字符。

那么写一个脚本来得到这些生成的随机数

<?php
$str_rand = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$auth="o9AJbQH3kTfxt7Y";
$len=15;
for ( $i = 0; $i < $len; $i++ ){
    for($fuck=0;$fuck<=61;$fuck++) {
        if ($i <= ($len / 2)) {
            if (substr($auth, $i, 1) == substr($str_rand, $fuck, 1)) {
                echo ($fuck)." ".($fuck)." "."0"." "."61"." ";
            }
        }
        if ($i > ($len / 2)) {
        if (substr($auth, ($i) * -1, 1) == substr($str_rand, ($fuck) * -1, 1)) {
            echo ($fuck)." ".($fuck)." "."0"." "."61"." ";

        }
    }
    }
}
?>

然后我这里写了个php的脚本跑半年跑不出

网上有人用c语言写了爆种子的脚本????(c语言怎么写的mt_rand????)

然后提示购买成功


NOSQL注入

 

One Response to “SWPUCTF 关于mt_rand

发表评论

电子邮件地址不会被公开。 必填项已用*标注