Register Globals (Exploit, PHP, Training)
介绍
这题所需的知识点是: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 总结 | 心 空