문제를 풀고 다른 풀이도 살펴봤습니다. 그런데 URL 뒤에 "//flag.php"를 입력하면 flag.php가 호스트로 인식된다는 얘기도 있고 그 외 다른 이유도 있던데, 정확히 어떤 이유로 우회가 되는건가요? 만약에 호스트로 인식된다면 파일 내용이 출력되는 이유는 뭐죠?
//flag.php를 호스트로 인식하는 것이 맞습니다.
parse_url 함수가 받은 인자를 어떻게 처리하는지 확인해보시면 알 수 있습니다.
https://github.com/php/php-src/blob/master/ext/standard/url.c
호스트로 인식하는 것은 index.php의 $url 변수에 들어간 "//flag.php" 값을 분석했을때 어디부터 어디까지가 host이고 어디까지가 path이고를 반환하는 것이지
http://~~~.dreamhack.games:{port}//flag.php 의 host를 flag.php로 해석하는 것은 아닙니다.
flag 파일이 출력되는 이유는 주어진 소스파일 만으로 정확히 알 수 없습니다.
index.php에는 flag 값을 출력하는 코드가 존재하지 않고 flag 값은 /flag.php에 있다는 문제 설명을 토대로 추측만 해보자면
parse_url, preg_match 함수를 적절히 우회한 값이 입력되었을 땐 flag.php 페이지가 출력될 수 있도록 nginx 설정을 해두었을 것으로 추정됩니다.
.php 확장자로 끝나는 경로를 제외한 모든 경로
와 /flag.php
에 접근하면 index.php를 호출하도록 설정을 해두면
/flag.php에 접근할 시 /index.php가 호출되고 parse_url 함수와 preg_match 함수에 의해 NO....
라는 값이 출력됩니다.
그리고 //flag.php를 입력하면 nginx에서 중복된 슬래시는 제거하여 해석하니 flag.php 파일을 호출하게 됩니다.