본문 바로가기

드림핵

[드림핵 워게임] file-download-1

위의 문제를 아래와 같은 과정으로 풀어보았다.

 

 

1. 사이트의 기능을 확인한다.

Upload My Memo 페이지로 들어가면 파일을 업로드할 수 있는 기능이 있는 것을 확인할 수 있다. 테스트 삼아 Filename과 Content에 아무 내용이나 적어 Upload해본다.

 

 

파일 업로드 후 Home 페이지에 들어가보면 내가 작성한 파일이 업로드되어 있는 것을 확인할 수 있다.

 

 

파일을 클릭해보면 내용을 읽을 수 있다.

 

 

2. 다양한 접근방법으로 취약점을 공략해본다.

우선 동적 리소스를 그대로 읽어내는지 확인하기 위해 javascript 코드를 입력한 scirpt.html 파일을 작성해서 업로드해본다.

<script>alert(1);</script>

javascript 코드는 위와 같이 간단하게 작성해보았다.

 

 

Home 페이지에서 script.html을 클릭하여 내용을 확인해보면 스크립트 코드가 그대로 실행되지 않고 내용이 텍스트로 출력되는 것을 확인할 수 있다. 동적리소스에 대해서는 취약점이 보완되어 있는 것을 알 수 있다.

 

 

다음에는  업로드하는 파일 이름에 ../ 명령어를 넣어 상위 디렉토리로 이동할 수 있는지 알아보았다.

우리가 찾아야할 flag가 flag.py에 있으므로 파일명을 '../flag.py'로 하여 파일 업로드를 시도했다.

 

 

bad characters,, 라는 문구가 나오며 오류창이 렌더링 된다. 이 부분을 app.py코드에서 확인해보았다.

 

if filename.find('..') != -1:
	return render_template('upload_result.html', data='bad characters,,')

app.py에서 위와 같은 코드를 찾아볼 수 있었다. 업로드하는 파일 이름에 .. 이 있으면 오류창을 렌더링하는 코드가 있다. 따라서 '../flag.py'를 파일명으로 하여 플래그를 읽어내려는 시도는 불가능한 것을 확인할 수 있다.

 

 

 

3.  url에서 파일을 읽어오는 원리를 이해한다.

다시 첫번째로 작성한 파일로 돌아가서, 파일을 읽어낼 때 url이 어떻게 바뀌는지 관찰해보았다.

'my-first-memo'라는 파일을 다운로드할 때 url에서 name 파라미터로 똑같이 'my-first-memo'가 전달되는 것을 확인할 수 있다.

이 부분을 이해하면 name 파라미터에 '../flag.py'를 전달하면 flag.py 파일을 읽어 출력해줄 것이라고 예상할 수 있다.

 

 

4. 익스플로잇 코드를 작성하여 플래그를 획득한다.

url의 name 값을 ../flag.py로 하여 요청을 보내면 flag를 얻을 수 있다.

'드림핵' 카테고리의 다른 글

[드림핵 워게임] blind-command  (0) 2022.11.11
[드림핵 워게임] web-ssrf  (0) 2022.11.06
[드림핵 워게임] image-storage  (0) 2022.11.02
[드림핵 워게임] Mango (조건 추가)  (1) 2022.10.08
[드림핵 워게임] Carve Party  (1) 2022.10.08