访问靶场
这里传入a和b参数,绕过三个if即可拿到flag
a = @ a=@ a=@_GET[ a’ ];中@是抑制报错信息的。
第一个if非常的抽象,
if($a==0 and $a){echo $flag1;
}
处理a
要输出flag1,a0,但是,在php中0被视为假也就是Flase
如果a0,则if(1and0)这个if语句任然为假不会输出flag。
PHP 会进行类型转换,如果 $a 的值是字符串(如 asa),则会被转换为 0 进行比较。在 PHP 中,非数字字符串在进行数值比较时被视为 0
这样就绕过a了。
处理b
if(is_numeric($b)){exit();
}
此处b不能为数字,准确的说不能为纯数字,不然就会执行exit函数。
if($b>1234){echo $flag2;
}
若要进入第三个if语句,则b经过处理后一定是有一个值可以与数字比大小
在进行比较时,PHP 会尝试将 $b 转换为一个数字。
字符串 如"12345a" 在转换为数字时,PHP 会从字符串的开始部分读取数字,直到遇到非数字字符为止。在这个例子中,“12345a” 会被转换为 12345。