0x01 源码
<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==="4476"){
die("no no no!");
}
if(intval($num,0)===4476){
echo $flag;
}else{
echo intval($num,0);
}
}
传入num=”0x117c”,num的类型为string。”0x117c”和”4476”两个string强比较,值不等,if匹配失败。intval()函数遇见0x,使用16进制,转换为10进制4476,4476和4476两个int强比较,值相等,if匹配成功。
0x02 Payload
?num=0x117c
?num=4476e
0x03 php中===与==区别
===比较两个变量的值和类型;==比较两个变量的值,不比较数据类型。
0x04 PHP函数
1.intval
intval — 获取变量的整数值
intval ( mixed $var [, int $base = 10 ] ) : int
参数
var
要转换成 integer 的数量值base
转化所使用的进制
Note: 如果
base
是 0,通过检测var
的格式来决定使用的进制:
- 如果字符串包括了 “0x” (或 “0X”) 的前缀,使用 16 进制 (hex);否则,
- 如果字符串以 “0” 开始,使用 8 进制(octal);否则,将使用 10 进制 (decimal)。
返回值
成功时返回 var 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。
最大的值取决于操作系统。
字符串有可能返回 0,取决于字符串最左侧的字符。 使用 整型转换 的共同规则。
<?php
$foo = 1 + "10.5"; // $foo is float (11.5)
$foo = 1 + "-1.3e3"; // $foo is float (-1299.0)
$foo = 1 + "bob-1.3e3"; // $foo is integer (1)
$foo = 1 + "bob3"; // $foo is integer (1)
$foo = 1 + "10 Small Pigs"; // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1; // $foo is float (11.0)
$foo = "10.0 pigs " + 1.0; // $foo is float (11.0)