buuctf [MRCTF2020]Ezaudit 伪随机数

打开网页,看不出什么,直接打开dirmap扫描

扫出了www.zip

下载后有index.php文件

查看源码后大概意思就是

去login.html页面登录,输入账号密码以及私钥,后2个输对了就能得到flag

密码可以直接用万能钥匙  1' or '1'='1  来绕过,主要就是私钥了

这里涉及到mt_srand()函数,伪随机数,即这随机数是我们可以预测的,只要找到该函数在这的种子值就可以预测,

因为公钥私钥都是使用一个种子值来推算的,所以说我们只要通过公钥逆向推出种子值,再通过种子值来推算出公钥私钥,公钥必然是原来那个,私钥就是我们要的值了。

这里用到脚本   php_mt_seed  ,百度下载在kali  make一下再使用

首先要将字符串转换成脚本可读的字符串(根据网上大佬说,是其文档内写的),转换代码如下

# -*- coding: utf-8 -*-
s = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
key = 'KVQP0LdJKRaV3n9D'
m = ''
for i in key:
    for j in range(len(s)):
        if i == s[j]:
            m += "{} {} 0 {} ".format(j,j,len(s)-1)
print(m)

复制,打开kali,

可以看出种子值为 1775196155,同时要求php版本在5.2.1到7.0.x之间,

打开wamp改成php5.6,然后localhost打开php文件

<?php
mt_srand(1775196155);
function public_key($length = 16) {
    $strings1 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $public_key = '';
    for ( $i = 0; $i < $length; $i++ )
    $public_key .= substr($strings1, mt_rand(0, strlen($strings1) - 1), 1);
    return $public_key;
  }

  //genarate private_key
function private_key($length = 12) {
    $strings2 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $private_key = '';
    for ( $i = 0; $i < $length; $i++ )
    $private_key .= substr($strings2, mt_rand(0, strlen($strings2) - 1), 1);
    return $private_key;
  }
echo public_key() . "<br>";
echo private_key();

?>

这里是还要打印出公钥的,

最后login.html输入即可得到flag

参考:https://www.jianshu.com/p/607af0735aa8

类似的buu题:枯燥的抽奖

猜你喜欢

转载自blog.csdn.net/qq_40519543/article/details/107481525