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题:枯燥的抽奖