打开题目,分析代码
<?php
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());
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,我们需要通过代码来获取flag。
题目要求我们向服务器传输一个参数’r‘,程序将flag用md5加密后,取前8位作为种子,用mt_srand()函数生成一个随机数,然后将两者相减,将结果赋值给$rand,如果$rand等于0,那么检查cookie中的token是否等于两个mt_srand() 的和,如果是,则输出flag。如果$rand不等于0,则输出$rand。因为mt_srand()的种子是用flag生成的,我们无法直接预测mt_srand()的输出。通过查阅资料得知,可使用php_mt_seed工具进行种子爆破。
php_mt_seed下载地址:https://www.openwall.com/php_mt_seed/
下载好后在宿主机解压好再移动到kali上。
先向服务器传输r=0,再用burp suite抓包分析,得到第一个mt_srand()的值:2101200197(每次不一一定都一样,都是随机生成)
在kali中使用php_mt_seed工具,首先输入make后就可正常使用
再通过抓包工具找到php版本
发现爆破处的php版本7.1.0+有两个,我们使用第一个种子:2041394035
用这个种子写一个php测试脚本
<?php
error_reporting(0);
mt_srand(2041394035);
echo mt_rand();
echo "===";
echo(mt_rand()+mt_rand());
?>
运行结果:
得到另一个值后在bp中改包添加Cookie值
修改后发送得到flag
自此,这题圆满解决!
总结
当我们在做php题时碰到不认识的函数,应及时查找函数的用法或漏洞。学习就是不断积累的过程,php中内置函数很多,不可能全部记得。 在完成者一题后又积累了新的工具php_mt_seed,同时也对mt_srand()函数有了更深的印象。
小编也还在不断学习中,通过博客来记录学习方法和过程,以上内容若有错误,欢迎大家留言指出,希望可以和大家共同进步。