CTF中php语言之is_numeric()和sleep()函数的绕过

  ` <?php
include 'flag.php';
isset($_GET['time'])?$time = $_GET['time']:$time = 0;
isset($_GET['num'])?$num = $_GET['num']:$num = 0;
$c=is_numeric($time) and is_numeric($num);
if ($num == 0) {
    if($num){
        if($c){
            if(!is_numeric($time))
                echo 'Time time must be number';
            else if ($time < 60 * 60 * 24 * 30 * 1)
                echo 'This time is too short';
            else if ($time > 60 * 60 * 24 * 30 * 2)
                echo 'This time is too long';
            else{
                sleep((int)$time);
                echo $flag;
            }
        }
        else
            echo 'Try again';
    }
    else
        echo 'Try again';
}
else
    echo 'Try again';
echo '<hr>';
highlight_file(__FILE__);
?>
 is_numeric() 函数用于检测变量是否为数字或数字字符串。若是则为true,否则为false
  1. 很明显该题用了两个比较关键的函数is_numeric()和sleep()这也是问题解决得关键。

  2. 要拿flag首先要绕过这两个函数,对于这题的sleep(),要延缓其下面程序执行的时间。但是我们又不能等太久,可以构造php中的科学计数法绕过,就构造一个time=0.3e07(等价于0.3乘10的7次方)的参数吧!当它强制转化为零的时候就会变成零,这样可以满足条件。

  3. 对于is_numeric();题目要求弱等于零,又要为一个不为零的数,我们可以构造一个0e1abc的数绕过,“0e1abc”=”0"。进行比较运算时,如果遇到了0e\d+这种字符串,就会将这种字符串解析为科学计数法。所以上面例子中2个数的值都是0因而就相等了。如果不满足0e\d+这种模式就不会相等。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值