[GWCTF 2019]枯燥的抽奖

Oyst3r 于 2023-08-25 发布

1.上来给了一个框框,且给了 10 个字符,然后应该是哪个大学出的题恶搞老师吧,常规的查看源代码,看到了 check.php,然后访问得到了源代码

2.开始审计,发现了这个 st_srand 这个函数是前所未见啊,搜一下用法,本来就是想简单搜一下,没想到搜出来漏洞,大概意思是说,这个东西会生成一个种子,然后当再用这个 st_rand 函数的时候,那么它就还是一直用的这个种子,不会变,所以当用这个 st_rand 函数的时候输入一个数,那么它返回值就是固定的一列数字了,写个简单的公式吧

st_rand(种子+一个数)=一列固定的数字,然后根据这数据就能爆破出来种子

3.因为题目给了 10 个字符,那么我们就有数据去爆破,怎么获得这个数据呢,其实就是个小学加减法,就是找这 10 个字母在那么已规定的字符串里面出现的位置就行,要想口算也行,怕出错我写了个 python 的 exp

str1 ='BRsgLS4h0K'
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 + ' '
            break

print(result)

运行的结果就是下面,之所以是这种形式,这个是要用到这个爆破脚本工具所规定的形式

37 37 0 61 53 53 0 61 18 18 0 61 6 6 0 61 47 47 0 61 54 54 0 61 30 30 0 61 7 7 0 61 26 26 0 61 46 46 0 61

然后将这个东西带入工具爆破种子,这个还是得等等的比较漫长

然后得到种子后就把种子固定死带到题目给的源码里面,我是先做了一个验证,想一次成功

此图片的alt属性为空;文件名为Screenshot_76-1024x523.png

这 6 个数字明显与 python 脚本运行出来的前 6 个是相同的,所以这个种子应该是木有问题的,重点就是注意把那个 php 的版本选对,一开始没选对弄了好几遍都不对

4.cv 题目给的脚本,稍作改动,开始运行

<?php

mt_srand(351079235);

$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
    $str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
}
$str_show = substr($str, 0, 20);
echo "<p id='p1'>"$str_show."</p>";
?>

果然得到了全部的 20 位字符,然后提交得 flag

Finish!!!