== 比较的时候自动进行类型转换而不改变原来的值,以是存在漏洞的位置每每是==

常见缺点用法:

if($input == 1){

md5php32PHP特征进击之MD5碰撞和strpos断定毛病 Docker

敏感类操作;如echo $flag;

}

例题:

if($_GET['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是成立的;