[Hack This Site] | Basic-8 | write-up

V123·2023년 10월 14일
0

Hack The Site

목록 보기
8/10
post-thumbnail

0x0 : 서비스 이해도

서비스에 대한 이해도는 'Grey-Box'로 볼 수 있을 거 같다.

0x1 : 정보 수집

문제 썸네일에서는 비밀번호가 어딘가에 숨겨져 있고, 'Sam'의 딸 분께서 PHP 프로그래밍을 한 페이지가 있다고 한다. 그리고 기술적 요구사항이 'SSI'이다.

비밀번호를 '/var/www/hackthissite.org/html/missions/basic/8/'디렉터리에 저장했다고 한다. 그리고 딸 분께서 프로그래밍한 PHP페이지는 보안이 전혀 없다는 정보만 주어졌다.

0x2 : 서비스 동작 방식 파악

일단, 어떤 서비스를 프로그래밍 했는지부터 살펴봤는데 그냥 사용자의 이름을 입력받으면 사용자에게 인사말을 건네는 페이지를 만들어서 반환한다. 이러한 서비스는 다양하게 구현이 가능하지만 기술적 요구사항이 'SSI'인 걸로 봐서는 SSI지시어를 통해 동적 페이지를 구성한 거 같다. 페이지 URL에서 확장자만 보더라도 '.shtml'이다. 이 역시, 사용자의 입력값에 대한 검증을 전혀 하지 않는다.

알다시피 'SSI'는 서버쪽에서 실행된다. 사용자가 요청할 경우 'SSI 지시어'가 삽입된 '.shtml'에서 'SSI 지시어'가 처리된 후 클라이언트로 다시 보내지게 된다. 그러나 여기선 바로 '.shtml'로 가는게 아니라 사용자의 입력값을 동적으로 받아내야 하므로 'level8.php'파일을 한번 더 거친다.

//level8.php
$fp = fopen("username.txt", "w");

fwrite($fp, "{$_POST['name']}");

fclose($fp);
//.shtml
<!--#include file="username.txt" -->

아마도 'level8.php'에서는 사용자의 입력값을 txt파일로 저장한 후 '.shtml'에서는 'SSI 지시어'를 통해 '.txt'파일을 불러올 거다.

0x3 : 공격 기법 마련

php파일에서 사용자의 입력값 검증없이 그대로 저장하므로 시스템 함수를 호출하는 php코드를 작성하면 될 거 같다.

0x4 : 익스플로잇

<?php 
	system('ls -al', $res); 
    echo $res;
?>

하지만 그냥 그대로 출력(?)되었다. 아마도 글쓴이가 생각한 방식대로 동작하지는 않는 거 같다.

0x5 : 서비스 동작 방식 파악(2)

다시 생각해보니, 아예 그냥 SSI를 지원하는 서버인 것이고 사용자의 입력값이랑 굳이 연관지어서 서비스가 동작할 필요는 없다고 생각했다. 막 'SSI 지시어' 일부분에 들어간다는 등 그런건 없다는 것이다.

사용자 입력값의 이름은 그냥 '.shtml'에 삽입되어 출력된다. 즉, 'HTML Code Injection' 취약점이 발생한다.

0x6 : 공격 기법 마련(2)

따라서, 아예 'SSI지시어'를 입력해주면 그대로 '.shtml'파일 내에 삽입되어 반환될 때 'SSI 지시어'가 실행될 거다. 이것이 바로 'HTML Code Injection'의 하위 개념인 'SSI Injection' 공격 기법이 된다.

0x7 : 익스플로잇(2)

<!--#exec cmd="ls ../"-->

위 'SSI 지시어'는 시스템 명령어를 호출하는 지시어이다. '~/8' 디렉터리에 포함된 파일과 디렉터리들을 출력한다. 현재 'SSI 지시어'가 실행되는 지점에서의 디렉터리 위치는 '~/tmp'에 위치하고 있기 때문이다.

그렇게 나온 결과 페이지는 예상대로 'SSI 지시어'가 삽입되어, 실행된 걸 볼 수 있다.

profile
보안과 개발을 공부하는 평범한 학생입니다.

0개의 댓글

관련 채용 정보