== 弱类型比较
基础方法
科学计数法
0e开头的会被识别为科学记数法,结果均为 0
<?phpif (isset($_GET['a']) && isset($_GET['b'])) {$a = $_GET['a'];$b = $_GET['b'];if ($a != $b && md5($a) == md5($b)) {echo "flag{XXXXX}";} else {echo "wrong!";}} else {echo 'wrong!';}?>
?a=s1885207154a&b=s1836677006a
md5("s1885207154a") => 0e509367213418206700842008763514md5("s1836677006a") => 0e481036490867661113260034900752
数组绕过
传入的是数组不是字符串,md5 函数无法解出其数值并且不会报错,返回结果是null
<?phpif (isset($_GET['a']) && isset($_GET['b'])) {$a = $_GET['a'];$b = $_GET['b'];if ($a != $b && md5($a) == md5($b)) {echo "flag{XXXXX}";} else {echo "wrong!";}} else {echo 'wrong!';}?>
md5等于自身
$str1 = $_GET['1'];if(isset($_GET['1'])){if($str1 == md5($str1)){echo $flag1;}else{die();}}else{die();}
用科学计数法绕过,原文和密文都是0e开头:
md5(0e215962017)=0e291242476940776845150308577824?1=0e215962017
md5加盐
$str2 = $_GET['2'];$str3 = $_GET['3'];if(isset($_GET['2']) && isset($_GET['3'])){if($str2 !== $str3){if(hash('md5', $salt . $str2) == hash('md5', $salt . $str3)){echo $flag2;}else{die();}}else{die();}}else{die();}
用数组绕过,因为加盐的时候数组的值都是 Array :
$salt = "something";$str2[] = 1;$str3[] = 2;echo ($salt . $str2);//somethingArrayecho ($salt . $str3);//somethingArray
