/x00

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。

 

上一篇:PHP判断客户端为PC还是手机


下一篇:安装mysql8.0.12