文章目录

官方说明:

Note a difference between 5.2 and 5.3 versions

echo (int)strcmp('pending',array());
will output -1 in PHP 5.2.16 (probably in all versions prior 5.3)
but will output 0 in PHP 5.3.3

Of course, you never need to use array as a parameter in string comparisions.

说在5.3.3以后,当比较数组和字符串的时候,返回是0.而strcmp函数的输出含义如下:

如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。


<?php
$password=$_GET['password'];

if(strcmp('xd',$password)){

    echo 'NO!';

}else{

    echo 'YES!';

}
?>

当php大于5.3.3以后,传入数组,果然进入了else分支。

11

对比php源码。图片来自于参考资料。
https://github.com/php/php-src/commit/58a673a9094bd26453e2b910b87ae45800ecc88c#L11L326
11
11
不懂C,大体看下意思,php5.2中是将两个参数先转换成string类型。而5.5中如果参数不是string类型,直接return了。结果为null。而if条件中需要一个布尔类型的变量。null自动转换成布尔false,而strcmp比较两个字符串相同时,结果为int 0.0转换成布尔也是false。从而导致绕过。

#可能的应用场景

登录绕过。验证码绕过。。。。

#参考资料
http://www.webhhh.net/web-security/PHP-strcpy.html

文章目录