Web Study/Training

[Dreamhack] file-download-1 문제 풀이

2023. 12. 31. 20:36

QUOTE THE DAY

Self-Talk
반응형

※ 본 내용은 공부 목적으로 작성된 내용입니다 ※ 잘못된 부분이 있으면 언제든지 댓글로 알려주세요!

 

 

 

서버를 생성하고 문제 파일 다운로드

 

01

 

페이지를 살펴보면 메모를 업로드하라는 index.html 페이지와 Upload My memo 페이지를 확인할 수 있습니다

메모를 업로드하라고 하니 업로드해줍시다

 

01

 

메모를 작성하고 메모지 페이지로 접속해 보니 파라미터 값에 우리가 앞서 작성한 '무사' 이름이 그대로 표시되어 있습니다

 

 

즉 URL 파라미터 값의 디렉터리 접근 공격을 이용하여 파일을 다운로드할 수 있습니다 ../ (상위 경로) 하나 입력했을 때는 존재하지 않는 경로라고 표시되지만 flag.py 파일을 찾아야 하므로 ../flag.py를 입력해 봅시다

 

 

그러면 이렇게 flag 값을 반환하는 걸 알 수 있습니다

해당 문제는 디렉터리 접근 공격으로 파일을 다운로드할 수 있다는 걸 알려주기 위해 쉽게 제출한 문제인 거 같습니다

 

#!/usr/bin/env python3
import os
import shutil

from flask import Flask, request, render_template, redirect

from flag import FLAG

APP = Flask(__name__)

UPLOAD_DIR = 'uploads'


@APP.route('/')
def index():
    files = os.listdir(UPLOAD_DIR)
    return render_template('index.html', files=files)


@APP.route('/upload', methods=['GET', 'POST'])
def upload_memo():
    if request.method == 'POST':
        filename = request.form.get('filename')
        content = request.form.get('content').encode('utf-8')

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

        with open(f'{UPLOAD_DIR}/{filename}', 'wb') as f:
            f.write(content)

        return redirect('/')

    return render_template('upload.html')


@APP.route('/read')
def read_memo():
    error = False
    data = b''

    filename = request.args.get('name', '')

    try:
        with open(f'{UPLOAD_DIR}/{filename}', 'rb') as f:
            data = f.read()
    except (IsADirectoryError, FileNotFoundError):
        error = True


    return render_template('read.html',
                           filename=filename,
                           content=data.decode('utf-8'),
                           error=error)


if __name__ == '__main__':
    if os.path.exists(UPLOAD_DIR):
        shutil.rmtree(UPLOAD_DIR)

    os.mkdir(UPLOAD_DIR)

    APP.run(host='0.0.0.0', port=8000)

 

flag 값은 쉽게 알아냈지만 왜 flag 값이 반환되는지 알아보기 위해 소스 코드를 해석해 봅시다

 

'/' 경로는 os 모듈에서 listdir 함수를 사용하는데 이 함수는 UPLOAD_DIR = 'uploads' 안에 있는 파일과 디렉터리 목록을 가져오는 역할을 합니다

 

'/upload' 경로는 우리가 Upload My memo 항목에서 메모를 작성할 때 POST 방식으로 메모를 작성합니다 하지만 파일명에 .. 문자열이 포함되어 있으면 메모 작성을 중지하고 'bad characters,,' 문구를 반환합니다 작성된 메모를 클릭하면 GET 방식으로 upload.html 템플릿을 렌더링 하여 클릭한 파일에 내용을 보여줍니다

 

'/read' 경로는 우리가 작성한 메모 페이지에서 name 파라미터 값을 전달받아 UPLOAD_DIR의 지정된 업로드 디렉터리에서 파일 내용을 읽어 반환합니다 앞서 '무사'라는 파일명은 /upload 경로에서 작성하여 현재 경로에서 '무사'라는 파일명 내용을 확인할 수 있습니다 결국 지정된 업로드 디렉터리 내부에 flag.py 파일이 존재했기 때문에 name 파라미터 값을 ../flag.py로 입력하면 flag 값을 확인할 수 있었습니다

 

 

[ 선수 학습 내용 ]

더보기
 

파일 다운로드 취약점(File Download Vulnerability)이란?

파일 다운로드 취약점 원리를 알아보기 앞서 절대 경로와 상대 경로부터 살펴보겠습니다 절대 경로 컴퓨터가 지정한 파일의 최초 경로를 절대 경로라고 합니다 예를 들어 hello.txt 파일을 생성할

mu-sa.tistory.com

 

반응형
저작자표시 (새창열림)
'Web Study/Training' 카테고리의 다른 글
  • [Dreamhack] Apache htaccess 문제 풀이
  • [Dreamhack] image-storage 문제 풀이
  • [Dreamhack] simple_sqli_chatgpt 문제 풀이
  • [Dreamhack] simple_sqli 문제 풀이
MUSA
MUSA
Nine Point Eight

최근 댓글

최근 글

인기 글

  • MUSA
    무사
    Nine Point Eight
    • 홈

    • 방명록

    • 분류 전체보기 (124)
      • Minecraft (29)
        • Server Development (16)
        • ResourcePack (7)
        • Plugin (5)
        • Java Plugin (1)
      • Tistory (15)
        • 티스토리 수익 (3)
        • 티스토리 검색 유입 (3)
        • 티스토리 꾸미기 (9)
      • Windows (2)
      • Kali Linux (42)
        • Linux (24)
        • Bandit (18)
        • Tool (0)
      • Web Study (26)
        • Theory (14)
        • Training (12)
      • CTF (5)
        • HackTheon (1)
        • Customized CTF (2)
        • CTF Write-Up (2)
      • Forensics (1)
      • System (1)
      • Cryptography (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 반응형
  • hELLO· Designed By정상우.v4.10.3
MUSA
[Dreamhack] file-download-1 문제 풀이
상단으로

티스토리툴바