php伪随机数
php伪随机数漏洞主要的函数就是mt_srand()函数和mt_rand()函数,其中mt_srand函数是通过种子来播种,那么只要我们得到了种子就可以得到之后的几次随机数,所以用mt_rand()函数得到的不是真正的随机数,被称为伪随机数。
注意:这个工具需要使用在linux环境下才能使用,下载好之后就进入该目录执行make命令,执行完后的结果如图
然后就可以通过伪随机数来获取种子,这样我们就可以得到下一次的伪随机数
从部分字符串得到种子
这种情况比较复杂,大概情况如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <?php
header("Content-Type: text/html;charset=utf-8"); session_start(); if(!isset($_SESSION['seed'])){ $_SESSION['seed']=rand(0,999999999); }
mt_srand($_SESSION['seed']); $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, 10); echo "<p id='p1'>".$str_show."</p>";
if(isset($_POST['num'])){ if($_POST['num']===$str){x echo "<p id=flag>抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}</p>"; } else{ echo "<p id=flag>没抽中哦,再试试吧</p>"; } } show_source("check.php");
|
这里就是通过每次在随机的地方获得字符串最后拼接出来一个长度为20的字符串,这里的话,因为她会返回部分字符串,所以我们可以通过脚本获得工具执行时所需要的数字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| str1 ='aeTxrcOLRO'//题目给的部分字符串 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)
|
至于这个脚本的原理,由于本人太菜了,暂时不知道为什么(
通过这个可以得到一串数字,然后再使用工具即可得到种子,得到种子过后我们就可以根据题目给出的php代码写出一个脚本得到完整的字符串,比如这道例题就可以编写出这样的脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?php
header("Content-Type: text/html;charset=utf-8"); session_start();
mt_srand(786492607); $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, 10); echo "<p id='p1'>".$str."</p>";
|
传值即可得到flag
例题来自buu的[GWCTF 2019]枯燥的抽奖