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)