== 比较的时候自动进行类型转换而不改变原来的值,以是存在漏洞的位置每每是==
常见缺点用法:
if($input == 1){
敏感类操作;如echo $flag;
}
例题:
if($_GET[39;a']!=$_GET['b'] && md5($_GET['a'])==md5($_GET['b'])){
echo $flag;
}
可以通过 MD5碰撞或数组形式绕过;
MD5函数返回32位的字符串,若以0e开头,类型转换机制(==)会将它识别为科学计数法 0 ;通过0e开头字符串绕过
s878926199a =》0e545993274517709034328855841020
s155964671a =》0e342768416822451524974117254469
改良版例题:
if($_GET['a']!=$_GET['b'] && md5($_GET['a'])===md5($_GET['b'])){
echo $flag;
}
这时MD5碰撞就不能成功了,在URL地址栏提交 a[]=1&b[]=2 成功绕过,由于当MD5函数的参数为一个数组时,函数会报错
返回NULL值,这样就可以绕过判断。
其他随意马虎判断缺点的函数,如strpos
(php4,php5,php7) strpos ---查找字符串首次涌现的位置
if(strpos($str1,$str2)==false){
敏感逻辑操作;
}
当 str1 在 str2 开头时,函数的返回值是 0,而 0==false是成立的;