CTFshow web入门爆破25

打开题目,分析代码

<?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()函数有了更深的印象。

小编也还在不断学习中,通过博客来记录学习方法和过程,以上内容若有错误,欢迎大家留言指出,希望可以和大家共同进步。


                
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Saber12_3_4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值