PHP特性攻击之MD5碰撞和strpos判断错误

在PHP中,比较俩个值是否相等可以用 == 和 ===

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

常见错误用法:

if($input == 1){

敏感类操作;如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是成立的;

特性   错误   PHP
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章