PHP弱類型總結


0x01:“==”和“===”

PHP中有兩種比較符號,“==”與“===”。“==”我們稱之為等值符,當等號兩邊為相同類型時,直接比較值是否相等;當等號兩邊類型不同時,先轉換為相同的類型,再對轉換后的值進行比較,如果比較一個數字和字符串或者涉及到數字內容的字符串,則字符串會被轉換成數值並且比較按照常數值進行比較。

<?php
var_dump("admin"==0);  //true
var_dump("1admin"==1); //true
var_dump("admin1"==1) //false
var_dump("admin1"==0) //true
var_dump("0e123456"=="0e4456789"); //true 
?> 
當一個字符串欸當作一個數值來取值,其結果和類型如下:如果該字符串沒有包含'.','e','E'並且其數值值在整形的范圍之內
該字符串被當作int來取值,其他所有情況下都被作為float來取值,該字符串的開始部分決定了它的值,如果該字符串以合法的數值開始,則使用該數值,否則其值為0
0x02:"array_search"與is_array"繞過
is_array:判斷傳入的是不是一個數組,array_search(x,$數組):在數組中尋找與指定值(x)相等的值,array_search函數
類似於"==",會進行類型的轉換
<?php
if(!is_array($_GET['test'])){exit();}
$test=$_GET['test'];
for($i=0;$i<count($test);$i++){
    if($test[$i]==="admin"){
        echo "error";
        exit();
    }
    $test[$i]=intval($test[$i]);
}
if(array_search("admin",$test)===0){
    echo "flag";
}
else{
    echo "false";
}
?>
在上面的栗子中,我們可以傳入test[]=0來進行繞過,首先test是一個數組,符合is_array的判斷,然后test=0;在array_search中0==admin為true,繞過了array_search。

0x03:strcmp漏洞繞過
strcmp是比較兩個字符串,str1<str2,返回<0,str1>str2,返回>0,相等時返回等於0
 1 <?php
 2     $password="***************"
 3      if(isset($_POST['password'])){
 4 
 5         if (strcmp($_POST['password'], $password) == 0) {
 6             echo "Right!!!login success";n
 7             exit();
 8         } else {
 9             echo "Wrong password..";
10         }
11 ?>
上述代碼中要求我們post一個password值,要與給定的password變量的值相等,但我們不知道password變量的值是什么!這怎么辦呢?
stamp期望傳入的值是字符串類型,但如果我們傳入數組類型會怎么樣呢?
我們傳入 password[]=xxx 可以繞過 是因為函數接受到了不符合的類型,將發生錯誤,但是還是判斷其相等

(ps:本人太菜,若有錯誤的地方歡迎大佬隨時責罵。。。。xixixii)


免責聲明!

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



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