0x1 isnumeric()函数的绕过

来源:互联网 发布:八字奶 知乎 编辑:程序博客网 时间:2024/05/21 19:44

原题:

<?phpshow_source(__FILE__);$flag = "xxxx";if(isset($_GET['time'])){         if(!is_numeric($_GET['time'])){                 echo 'The time must be number.';         }else if($_GET['time'] < 60 * 60 * 24 * 30 * 2){                 echo 'This time is too short.';         }else if($_GET['time'] > 60 * 60 * 24 * 30 * 3){                 echo 'This time is too long.';         }else{                 sleep((int)$_GET['time']);                 echo $flag;         }                 echo '<hr>'; }?>


根据原题意思,第一步判断参数time是否为数字或者数字字符串,然后判断是否在60*60*24*30*2和60*60*24*30*3之间,如果满足上述条件,然后睡上time这么长的时间输出flag

但是明显的是我们不能等上2~3个月的时间让flag输出来

重新看源码,可以看到最后sleep用了一个int类型的强制类型转换,可以用一些比较特殊的time值经过截取后获取一个较小的time值,重新看is_numeric函数

is_numeric()函数存在一个绕过方式就是输入十六进制进行SQL注入,把1 or 1之类的十六进制输入进去,但是在这里不是进行SQL注入,我们绕过的是时间大小的限制

通过计算器,我们可以得到限制的时间范围最小是5184000秒,转换成16进制就是0x4F1A00

传参time=0x4F1A00,通过了四次判断,GET获取值类型为字符串,最后sleep函数中进行类型转换的时候0x4F1A00,遇到字母就停止转换,变成了0,也就不用睡觉了

最后得出结果


原创粉丝点击