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
然后将这个东西带入工具爆破种子,这个还是得等等的比较漫长
然后得到种子后就把种子固定死带到题目给的源码里面,我是先做了一个验证,想一次成功
这 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!!!