본문 바로가기
Hacking/DreamHack

[DreamHack] 드림핵 Apache htaccess

by st-og 2024. 1. 20.

문제 확인

해당 문제는 필터링을 우회하여 파일 업로드를 통해 flag를 획득하는 문제이다.

서비스 분석

해당 페이지에 접속하면 아래와 같은 페이지를 확인할 수 있다.

 

인덱스 페이지에는 파일을 선택하고 업로드하는 기능이 있음을 알 수 있으며 서비스 분석을 위해 임의의 파일을 업로드하였다.

 

위의 그림은 임의의 파일 st-og.PNG 파일을 업로드 했을 때 출력되는 페이지이다.

 

해당 그림을 통해 업로드된 파일은 /upload/경로에 저장됨을 알 수 있으며 해당 경로로 접속 시 파일의 내용을 확인할 수 있음을 아래의 그림을 통해 확인하였다.

소스 코드

아래 코드는 인덱스 페이지를 구성하는 index.php의 코드이다.

5~25: 인덱스 페이지의 출력되는 화면을 구성하기 위한 html코드이다.

26~34: 선택된 파일의 이름을 화면에 출력하기 위한 js 코드이다.

 

 

아래 코드는 파일 업로드가 일어나는 upload.php의 코드이다.

2: 필터링이 될 확장자명을 나열한 리스트를 생성

4~8: 받아온 파일의 정보를 각 변수에 저장

10~11: 에러코드가 0이 아닐 경우 에러로 간주하며 에러 메시지 출력

12~14: 파일명을 이름과 확장자로 나누어 extension변수에 확장자를 저장한다.

16~17: 확장자명이 필터링 리스트에 포함되어 있을 경우 에러 메시지를 출력하며 중단한다.

18~20: 업로드한 파일을 /upload/의 경로에 저장하며 해당 경로의 a링크를 화면에 출력한다.

23~25: 위의 경우가 아닐 경우 파일을 선택하지 않았으므로 파일 선택 메시지를 출력한다.

문제 해결

해당 문제는 파일 업로드 취약점을 이용하여 웹쉘을 업로드하여 flag를 획득하여야 한다.

php로 작성된 웹 사이트이기에 php의 웹쉘을 업로드 해야 하지만 php의 다른 이름까지 필터링되어 있기에 업로드하기에 어려움이 있다.

 

이때 사용할 수 있는 방법이 문제의 제목에 나와 있듯이 htaccess파일을 통해 필터링을 우회하는 방법이다.

htaccess파일이란 간단히 설명하면 해당 디렉터리와 그 하위 디렉터리의 설정에 대해 지정하는 파일이다.

 

해당 파일을 웹쉘을 사용할 수 있도록 설정한 후 업로드를 하면 /upload 디렉터리에 htaccess파일이 저장될 것이고

저장된 htaccess파일을 통해 /upload 디렉터리는 자신이 설정한 대로 조작이 가능하게 된다.


먼저 업로드할 htaccess파일을 만들기 위해 메모장을 이용하여 아래의 설정 명령어를 작성 후 이름을 .htaccess로 저장하였다.

AddType : 새로운 타입을 추가하기 위한 명령어
application/x-httpd-php: 웹서버가 해당 타입을 만나면 php파일로 인식함
.text: 파일의 확장자를 나타낸다. 웹서버가 .text확장자를 만나면 php파일로 인식하게 한다.

 

위의 그림과 같이 입력한 파일을 업로드하였다.

 

해당 파일을 업로드하였기에 /upload디렉터리의 .text확장자로 끝나는 파일들은 모두 php와 동일한 기능을 하게 설정되었다. 이제 .text의 확장자로 끝나는 웹쉘을 업로드하면 된다.

 

업로드할 웹쉘을 생성하기 위해 메모장을 통해 아래의 명령어를 입력하고 확장자를 .text로 저장하였다.

GET메서드를 통해 cmd파라미터의 값을 가져와 system함수를 사용하여 쉘 명령어를 사용할 수 있도록 하였다.
웹쉘의 정상 작동을 확인하기 위해 <p> 태그를 통해 화면의 출력되는 메시지로 표시하였다.

 

위에서 작성한 웹쉘을 업로드한 후 cmd파라미터를 통해 id명령어를 입력하였다.

 

정상적으로 id명령어가 실행됨을 확인하였다.

 

flag의 위치를 알아내기 위해 find명령어를 사용하였다.

find / -name "flag" 2>/dev/null
# /경로에서부터 이름이 flag인것을 찾는다. 2>/dev/null을 통해 오류 메시지는 출력하지 않는다

 

 

해당 명령어를 통해 flag는 /flag에 위치해 있는 것을 알 수 있다.

해당 파일을 실행하게 되면 아래 그림과 같이

 

flag를 획득할 수 있다.

FLAG

DH{9aeba1a6feed3769ae0915b62db2b4872bec98c2}