문제.
<?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가 되므로 답이 나온다.
'webhacking > etc' 카테고리의 다른 글
WeChall Training: PHP LFI, PHP 0817, Training: Register Globals, PHP 0819 (0) | 2015.07.06 |
---|---|
adm1nkyj님의 새 워게임 (0) | 2015.07.05 |
overthewire natas 12, 13, chall.tasteless.eu Get Me Down (0) | 2015.06.27 |
wargame.kr mini TBR (0) | 2015.05.24 |
securitytraps.pl pre, Who am I?, StrCmp, Training, The Truth (0) | 2015.05.08 |