문제 질문

문제를 풀고 다른 풀이도 살펴봤습니다. 그런데 URL 뒤에 "//flag.php"를 입력하면 flag.php가 호스트로 인식된다는 얘기도 있고 그 외 다른 이유도 있던데, 정확히 어떤 이유로 우회가 되는건가요? 만약에 호스트로 인식된다면 파일 내용이 출력되는 이유는 뭐죠?

#web
작성자 정보
답변 1
avatar
limelee
강의 수강: 10

//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 파일을 호출하게 됩니다.

2024.12.10. 18:29
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기