Web Hacking/Dreamhack 풀이

file-download-1

박연준 2023. 6. 25. 17:41

file-download-1

문제 정보

  • File Download 취약점이 존재하는 웹 서비스입니다.
  • flag.py를 다운로드 받으면 플래그를 획득할 수 있습니다.

풀이

 접속하면 먼저 Your uploaded memos가 출력되는걸 볼 수 있다.

 Upload My Memo에 들어가면 Filename과 Content에 입력란이 있다.

먼저 Filename과 Content에 123, 123을 한 번 넣어봤다.

다시 메인 홈페이지로 돌아와서 확인해보면 123이라는 파일이 업로드 되어 있다.

123의 파일 링크를 한 번 확인해보려면 웹페이지 좌측 하단에 검은색으로 파일 링크가 있는걸 확인할 수 있다.

 문제를 살펴보자

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)

문제를 한 번 살펴보면 상위 디렉토리로 가는 .. 을 막아논 걸 볼 수가 있다.

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

.을 우회하기 위해서는 URL encoding이라는 것으로 우회를 할 수 있다. 다음 그림은 URL encoding 표이다.

따라서 .을 %2E로 우회해서 다시 Upload My Memo 페이지의 Filename에 %2E%2E/flag.py를 입력해 보았더니 오류가 났다.

다시 / 문자도 URL encoding을 적용해서 %2E%2E%2Fflag.py를 Filename에 입력해준다.

flag.py 의 FLAG값이 나온 걸 볼 수 있다.

 

'Web Hacking > Dreamhack 풀이' 카테고리의 다른 글

Client Side Template Injection 풀이  (0) 2023.06.26
CSRF Advanced  (0) 2023.06.26
image-storage  (0) 2023.06.25
command-injection-chatgpt  (0) 2023.06.25
command-injection-1  (0) 2023.06.25