簡介
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