포스트

webhacking.kr old 28 문제 풀이

webhacking.kr old 28 문제 풀이

webhacking.kr old 28 문제 풀이

문제 풀이

  1. 웹쉘 업로드 시도
    • 꺽쇠가 오픈 꺽쇠가 필터링돼어 작동하지 않음
  2. php5, phtml 확장자 시도, 실패
1
<!--?php $flag="FLAG{easy_peasy_apachy}"; ?-->
1
2
Mission : read ./upload/5uJm3p959SYT/flag.php
your file will be upload at ./upload/5uJm3p959SYT/

문제 페이지에 접속하면 위의 문구가 뜨면서 랜덤 디렉토리 내부의 flag.php 파일을 읽는 것이 목표라고 한다.
그리고 그 아래에 파일을 업로드 할 수 있는 form이 준비돼있다. 아마 파일 업로드 취약점을 이용하라는 듯 하다.

./upload/5uJm3p959SYT 에 접속해보니 403에러로 접근이 막힌다.
반면에 ./upload/5uJm3p959SYT/flag.php는 접속은 가능하지만 php 파일인 만큼 파일 그대로가 출력되지 않고 어떤 프로세스를 거쳐 서버에서 반환하고자 하는 것만 나오기 때문에 플래그를 곧바로 알 수 없다.

최종 풀이

웹쉘 업로드

내가 파일을 업로드하면 해당 파일이 flag.php와 같은 디렉토리에 업로드 된다고 한다.
그래서 처음으로 생각해낸 풀이법은 웹쉘을 업로드하는 것이었다.

구글에 웹쉘을 검색해서 가장 쉽게 얻을 수 있는 코드를 복사하고 webshell.php라는 파일에 붙여넣어 업로드해보았다.
그 이후로 ./upload/5uJm3p959SYT/webshell.php에 접속을 해보니 열린 홑화살괄호(<)가 필터링돼 파일이 제대로 컴파일되지 않는 모습이 발견됐다.

혹시 .php5, .phtml, .phar 등등 여러가지 파일 확장자들도 시도해보았지만 먹히지 않았고 화살괄호를 우회하기 위한 다른 인코딩 방식도 사용해보았지만 역부족이었다.

설정 파일 조작

그렇게 생각을 거듭하던 중 내가 업로드한 파일이 플래그 파일과 동일한 디렉토리에 들어간다는 사실이 뭔가 일종의 힌트같다는 느낌이 들었다.
PHP를 이용한 웬만한 웹서버는 Apache를 사용하는데 아파치는 해당 서버의 모든 설정을 다루는 글로벌 설정 파일이 있는 반면 각 디렉토리마다 추가로 설정값을 줄 수 있는 .htaccess라는 파일이 존재한다.

예를 들어 루트 디렉토리 안에 a와 b라는 디렉토리가 있을 때 b 디렉토리의 .htaccess 파일에 명시된 설정값은 b 디렉토리 내부의 파일들에만 적용되는 방식인 것이다.

.htaccess 파일로 다양한 설정을 건드릴 수 있는데 해당 문제를 풀 때 우리가 필요한 것은 .php 확장자가 php 파일로 컴파일되는 대신 그냥 출력되게 하는 것이다.

1
php_flag engine off

위의 설정값이 바로 이럴 때 사용할 수 있는 옵션이다.
php 확장자에 대해 해석해주는 엔진을 꺼버린다는 의미로 이때 .php에 접속을 하면 해당 코드가 실행돼 결과를 보는 것이 아니라 순수 php 파일 내부를 읽을 수 있다.

위 옵션을 .htaccess라는 파일을 만들어 붙여넣고 업로드한 후 ./upload/5uJm3p959SYT/flag.php에 접속하면 플래그를 얻을 수 있다.
참고로 플래그는 HTML의 주석에 있다.

배운 것

파일 업로드 취약점이 있을 때 목표 파일과 업로드한 파일이 같은 디렉토리에 들어가는 상황을 유심히 봐야할 듯 하다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.