Register Globals

문제의 코드는 아래와 같다.

[code lang-php]# 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());
        }
}
[/code]

여기서 Register Globals 옵션이 꺼져 있으면 login 변수를 GET 인자로 전달할 수 있다. 따라서 아래와 같이 GET 인자를 구성하여 넘기면 된다.

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

참고 : http://php.net/manual/en/security.globals.php

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다