前置知识
php_mt_seed是什么?
我们都知道mt_srand(seed)这个函数是用来生成伪随机数的,seed值只要确定,那么生成的随机数也一样。
例如:
<?php
mt_srand(1);
echo intval(mt_rand())
?>
这里我们的seed值是1,然后我们的输出结果是895547922,只要seed值一样,那么我们大家最后的输出结果都是一样的。
那我们的php_mt_seed又是干什么的呢?
当我们得到一个随机数,就可以通过这个工具爆破他的seed值,有点像溯源。
php_mt_seed下载地址
下载完后我们把它拖进kali里面
在工具的地方打开终端
使用前需要make一下,然后再输入./php_mt_seed 随机数
接下来我们通过ctf.show.web25来说明一下具体应用
打开靶场,是一小段代码审计
error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
$r = $_GET['r'];
mt_srand(hexdec(substr(md5($flag), 0,8))); //这个条件可以不管,没用
$rand = intval($r)-intval(mt_rand()); //r=0,得到负的第一次随机数
if((!$rand)){
if($_COOKIE['token']==(mt_rand()+mt_rand())){
echo $flag; //关键
}
}else{
echo $rand;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}
要想得到flag需要通过cookie传一个token的值,要等于mt_rand()+mt_rand(),这是第二次和第三次随机数的值之和。要得到它,我们需要知道种子seed的值。
这里就可以发挥我们的工具的作用了。首先我们需要知道第一次随机数的值,才可用工具爆破出。
这里我先用get方法传一个r=0
然后转到kali进行爆破
这里扫到不同版本的种子,我们根据wappalyzer插件可得知php当前网站使用的php版本
简单编写一个php代码,把token的值算出来
<?php
mt_srand(2363123205);
echo intval(mt_rand()) . "<br>";
echo intval(mt_rand())+ intval(mt_rand());
?>
我们通过hackbar传过去
传r的值要注意使$rand等于零代码才能往下走,这里的r值就是前面页面返回的随机数。
自此,这题圆满解决!
总结
当我们在做php题时碰到不认识的函数,应及时查找函数的用法或漏洞。学习就是不断积累的过程,php中内置函数很多,不可能全部记得。 在完成者一题后又积累了新的工具php_mt_seed,同时也对mt_srand()函数有了更深的印象。
博主还是小白,也还在不断学习中,通过博客来记录学习方法和过程,以上内容若有错误,欢迎大家留言指出,希望可以和大家共同进步。