BUGKU:http://120.24.86.145:9009/19.php
還沒看完源碼,我就直接加了一個password[]=1結果就拿到flag了。然后再看源碼我自己都搞不懂為什么可以得到源碼。真的,不信你看。
1 <?php 2 $flag = "flag"; 3 4 if (isset ($_GET['password'])) { 5 if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) 6 echo 'You password must be alphanumeric'; 7 else if (strpos ($_GET['password'], '--') !== FALSE) 8 die('Flag: ' . $flag); 9 else 10 echo 'Invalid password'; 11 } 12 ?>
先來談論一下標准的答案:
第一個條件:
必須以數字或者字母開頭(其實看到ereg就可以想到%00截斷)
第二個條件:
必須在password參數中找到--。
所以得出以下正解:
index.php?password=a%00--
那么話又說回來了,為什么直接password[]=a就可以繞過呢?
1.ereg只能處理字符,而你是數組,所以返回的是null,三個等號的時候不會進行類型轉換。所以null不等於false。
2.strpos的參數同樣不能夠是數組,所以返回的依舊是null,null不等於false也是正確。
所以可以拿到flag
小結:
1.倘若函數的參數不符合其函數要求的時候返回的是null值