弱類型比較
===: 在進行比較的時候,會先判斷兩種字符串的類型是否相等,再比較
==: 在進行比較的時候,會先將字符串類型轉化成相同,再比較,如果比較的是一個字符串和一個數字,則字符串會被轉化為數值。
# 例題:
$v1 = _GET('v1');
$v2 = _GET('v2');
if($v1!=$v2 && md5($v1)==md5($v2){
echo $flag;
}
解決方案1:利用弱類型比較
字符串的開始部分決定了它的值,如果該字符串以合法的數值開始,則使用該數值,否則其值為0。若以xe
方式開頭則按照科學計數法轉化。
$v1=240610708,$v2=QNKCDZO,這兩個參數不相等;
md5(’240610708′) 的結果是:0e462097431906509019562988736854
md5(‘QNKCDZO’) 的結果是:0e830400451993494058024219903391
弱類型比較時都轉換為0,則判斷相等。
解決方案2:利用md5()函數的特點。
md5()函數加密一個數組時會報錯,返回null。
因此,只要另$v1,$v2為兩個值不同的數組即可繞過。
即url傳入:v1[]=1 && v2[]=2
strcmp()函數繞過
strcmp()函數用來判斷兩個字符串是否相等,若相等,返回0。php在5.3版本之前若傳入的是一個非字符串類型數據,比如數組和對象,則會報錯,但在報錯的同時會返回0。
# 例題:
$v = _GET['v'];
if(!strcmp($v,$flag){
echo $flag;
}
解決方案
url傳入:v[]=1