当前位置: 代码迷 >> 综合 >> 【代码审计】buu_[GWCTF 2019]枯燥的抽奖
  详细解决方案

【代码审计】buu_[GWCTF 2019]枯燥的抽奖

热度:56   发布时间:2024-01-19 13:25:53.0

1.根据提示出前十位的号码,猜测应该需要爆破后面十位,抓包发现发送到check.php:

2.跟进查看代码:

原理:因为代码中是通过种子seed生成了随机数,但是mt_srand()这个函数存在漏洞,php中mt_rand()生成的是一个伪随机数,是通过算法生成出来的,可以根据这个来进行爆破得到mt_srand()里的种子

3.将给出前十个密码解析成php_mt_seed需要的参数,伪随机数生成脚本:

str1 ='Xisiab1m0D'
str2 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
result =''length = str(len(str2)-1)
for i in range(0,len(str1)):for j in range(0,len(str2)):if str1[i] ==  str2[j]:result += str(j) + ' ' +str(j) + ' ' + '0' + ' ' + length + ' 'breakprint(result)

4.kali上下载工具php_mt_seed-4.0,使用该工具爆破php伪随机数的种子:

./php_mt_seed 59 59 0 61 8 8 0 61 18 18 0 61 8 8 0 61 0 0 0 61 1 1 0 61 27 27 0 61 12 12 0 61 26 26 0 61 39 39 0 61

5.重新用phpstorm跑一下爆破的种子:

<?php
mt_srand(578931025);$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){$str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
}
echo $str;
?>

6.将爆破结果进行输入即可:

参考文章:PHP mt_rand安全杂谈及应用场景详解 - FreeBuf网络安全行业门户