PHP弱型別的學習
阿新 • • 發佈:2021-09-08
關於==和===
==是比較兩個值,如果型別相同就比較值,如果型別不同就轉換型別進行比較
===是強相等,是要比較兩者的型別也要一樣
問題就出在==的型別轉換上
行比較。
<?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
?>
當把一個字串和數字進行比較的時候進行型別轉換,會把字串轉換成int型別的,具體規則為:
如果該字串沒有包含'.','e','E'並且其數值值在整形的範圍之內 該字串被當作int來取值,其他所有情況下都被作為float來取值,該字串的開始部分決定了它的值,如果該字串以合法的數值開始,則使用該數值,否則其值為0。
x02:"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 可以繞過 是因為函式接受到了不符合的型別,將發生錯誤,但還是判斷其相等