题目描述
进入场景看看:
代码如下:
$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}
解题思路
- 需要读懂一下这段PHP代码的意思
- 明显是一道get相关的题目,需要提供一个num的参数,然后需要传入一个不是数字但等于1的值,也就是
PHP的弱比较
,见最后的//【新知识点】 - 熟悉is_numeric函数:函数用于检测变量是否为数字或数字字符串。见最后的//【新知识点】
相关工具
略
解题步骤
- 解读代码的意思
定义一个num参数,
ps:【不是数字又要等于1,可真矛盾!】。
- 直接测试一下
在1后面随便加一个不是数字的字符:
/?num=1</br>
得到了flag。
此外,还可以使用%00截断
【新知识点】,来处理这个函数is_numeric():
/?num=1%00
得到Flag
flag{2cdfe6ebc7440d87eefc859989455fca}
新知识点
- PHP is_numeric() 函数
关于PHP is_numeric()函数:
bool is_numeric ( mixed $var )
如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE。
- php弱比较
弱比较(相等比较符==):只要求比较的两个值在转换类型后相等即可。如果两个值的类型不同,会尝试将其中一个值转换为另一个值的类型。
将字符串转换成数字的机制如下:
1==“1admin” //true
1==“admin” //false
1==“admin1” //false
所以,本题中直接在数字后面加上字母就会被转换成数字。
- %00截断原理分析
在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束