http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php
题解:
view-source:
if (isset ($_GET['nctf'])) {
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
echo '必须输入数字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '骚年,继续努力吧啊~';
}
可直接访问源代码,关于@ereg()函数,int ereg(string pattern, string originalstring, [array regs]);
,ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。所以,本题中@ereg ("^[1-9]+$", $_GET['nctf'])
即要求nctf变量必须是数字,google发现ereg函数存在%00截断漏洞,当遇到%00(NULL)时,函数就截止了。strpos(string,find,start)
,strpos()函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。即strpos ($_GET['nctf'], '#biubiubiu')
函数要求nctf变量中需要包含'#biubiubiu'字符串,才能返回flag。此题目前知道有两种方法绕过:
方法一:使用%00截断,构造payload如nctf=1%00%23biubiubiu
,这里#符号需要进行URL编码,输入后的得到flag。
方法二:使用数组的形式绕过,payload为:nctf[]=123
,传入之后,ereg是返回NULL的,===判断NULL和FALSE,是不相等的,所以可以进入第二个判断,strpos处理数组时,也是返回NULL,注意这里的是!==,NULL!==FALSE,条件成立,拿到flag。