介绍

这题所需的知识点是:register global---将所有提交的参数注册为全局变量,进而将某些变量的值覆盖为我们所需要的。更多参考PHP: Using Register Globals - Manual

分析

这题和mysql I那题很类似,但是由于加了一个判断:

if (strtolower($login[0]) === 'admin') {
        $chall->onChallengeSolved(GWF_Session::getUserID());
}

判断中的$login[0]在28行已经被赋值为$_POST['username']

所以不能通过将username的值提交成admin'#来完成这题。

解决

从32行开始,有下面这段代码:

if (isset($login))
{
        echo GWF_HTML::message('Register Globals', $chall->lang('msg_welcome_back', array(htmlspecialchars($login[0]), htmlspecialchars($login[1]))));
        if (strtolower($login[0]) === 'admin') {
                $chall->onChallengeSolved(GWF_Session::getUserID());
        }
}

意思是:如果$login[0] === 'admin',那么解题成功。

由于在28行已经有下面代码:

$login = array($_POST['username'], (int)$row['level']);

因而,$login[0]已经被赋值为$_POST['username'],但是可以通过全局变量来覆盖它。

在这里,程序会将GET等语句得到的变量注册成为全局变量,就可以覆盖掉源代码中的变量值。

因此在地址栏输入下面链接,回车即可成功解题

http://www.wechall.net/challenge/training/php/globals/globals.php?login[0]=admin

参考:
WeChall Journal | 陈文青
WeChall 总结 | 心 空