web115笔记(is_numeric函数判断数字)
<?php /* # -*- coding: utf-8 -*- # @Author: Firebasky # @Date: 2020-09-16 11:25:09 # @Last Modified by: h1xa # @Last Modified time: 2020-10-01 15:08:19 */ include('flag.php'); highlight_file(__FILE__); error_reporting(0); function filter($num){ $num=str_replace("0x","1",$num); $num=str_replace("0","1",$num); $num=str_replace(".","1",$num); $num=str_replace("e","1",$num); $num=str_replace("+","1",$num); return $num; } $num=$_GET['num']; if(is_numeric($num) and $num!=='36' and trim($num)!=='36' and filter($num)=='36'){ if($num=='36'){ echo $flag; }else{ echo "hacker!!"; } }else{ echo "hacker!!!"; } hacker!!!
trim是函数移除字符串两侧的空⽩字符或其他预定义字符
这里用了is_numeric来判断是不是数字,并且if条件里规定trim($num)移除字符串两侧的字符不能等于36,但后面的if需要等于36才能输出flag,而且自定义函数filter也把16进制和8进制等等封死了,我们写个脚本看看有什么字符可以利用
<?php for ($i = 0; $i <= 128; $i++) { $a = chr($i) . '36'; if (trim($a) !== '36' && is_numeric($a)) { echo urlencode(chr($i)) . "\n"; } }
发现%0C,也就是\f分页符可以利用,不会被trim过滤掉,所以payload为
?num=%0c36
发现能⽤%0c来绕过trim函数
浙公网安备 33010602011771号