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值