简介
PHP函数的安全特性-strcmp() 函数
php-strcmp()函数
PHP strcmp() 函数
strcmp() 函数比较两个字符串。
注释:strcmp() 函数是二进制安全的,且区分大小写。
语法:
strcmp(string1,string2)
string1 必需。规定要比较的第一个字符串。
string2 必需。规定要比较的第二个字符串。
返回值:
- 0 - 如果两个字符串相等
- <0 - 如果 string1 小于 string2
- >0 - 如果 string1 大于 string2
测试代码1:
<?php echo strcmp("Hello world!","Hello world!").'<br>'; // 两字符串相等 //0 echo strcmp("Hello world!","Hello").'<br>'; // string1 大于 string2 //7 echo strcmp("Hello world!","Hello world! Hello!"); // string1 小于 string2 //-7 ?>
结果:
测试代码2:
在PHP5.3之前,传入数据的类型是字符串类型,当传入的类型不是字符串类型 函数就会发生错误,显示报错信息后会return0 所以漏洞就出现在了这里 我们看一个案例
要求get传进来的值要与$password变量里面的值相等因为用了strcmp函数所以他们俩的值相等才会返回0,0==0才能正常输出我们的flag!所以我们可以利用这个函数特性绕过它
<?php $password="***************"; if(isset($_GET['password'])){ if(strcmp($_GET['password'],$password)==0){ echo "flag{xxxxx-xxx-xxxx}"; }else{ echo "NO password "; } } ?>
注意看这里我们构造password为一个数组数组传值为1,而strcmp要求我们传入字符串 strcmp函数判断不是字符串会报错,但是会return0 所以我们的目的达到了得到flag
参考学习:https://www.runoob.com/php/func-string-strcmp.html
https://www.php.net/manual/zh/function.strcmp.php