webhacking/etc

securitytraps.pl Let's start

qkqhxla1 2015. 7. 2. 17:47

문제.

<?php
//by Mawekl
//more challenges coming soon ;)

function validateuser($user)
{
    #Check username
    if(!preg_match('/^[A-Z][a-z]{1,15}$/',$user))
        die('Are you stupid hacker? Don\'t try inject my script!');
}

function validatepass($pass)
{
    #Check password (injection attempt?)
    if(!preg_match('/^[A-Za-z0-9_ ]+$/',$pass))
        header('Location: http://piv.pivpiv.dk/');
        #kick away stupid hacker!
}

function challenge($user, $pass) //Objective: return TRUE
{
    $users = array(
        "Admin" => $_VeryLongPasswords[0],
        "Mawekl" => $_VeryLongPasswords[1]
    );
    validateuser($user);
    validatepass($pass);
    return ($users[$user] == $pass);
}

?>

내가 입력한 아이디와 비밀번호를 받아서 validateuser함수와 validatepass함수를 실행킨후, $users[$user] == $pass이면 통과된다. 기본적인 정규식이 있어서 id는 대문자로 시작하고, 소문자로 뒤를 채우면 die()부분은 벗어난다. 

비밀번호 검사부분의 정규식을 만족하지 않으면 header('Location: http://piv.pivpiv.dk/');로 저 사이트로 이동시켜버린다. 잘못 쳐서 들어가보면 듣기싫은 노래가 나옴을 알 수 있다.

한참 생각해보니 header로 그냥 저 사이트로 이동시켜버리는게 검사의 전부이다. 이동을 시켜버리고, 문제 페이지에는 내가 입력한 값이 남아있다는 소리이다. users배열은 Admin과 Mawekl이 있는데 둘다 해당 값을 알 수가 없다.($_VeryLongPasswords[0]등의 값은 알수가 없음.)


그러므로 저 array에 없는 값를 입력하면 $users[입력값] = ''이 나올것이다. 대충 user로 Qkqhxla을, pass로 빈칸을 입력 후 프록시로 받은 값을 잡아보면 헤더에

HTTP/1.1 302 Found

Date: Thu, 02 Jul 2015 08:54:09 GMT

Server: Apache/2.4.7 (Ubuntu)

X-Powered-By: PHP/5.5.9-1ubuntu4.9

Location: http://piv.pivpiv.dk/

Content-Length: 4408

Content-Type: text/html


이렇게 Location이 설정되있는데, 저 라인을 지워버리면 return ($users['Qkqhxla'] == '') 이 되어 true가 되므로 답이 나온다.