[PHP安全特性學習]strcmp()函數安全漏洞


簡介

 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM