카테고리 없음

워게임 file-download-1

미숫가루빙수 2023. 5. 14. 22:17

 

풀기 전에 문제를 간단하게 읽어본다.

 

File Download의 취약점을 파악해

flag.py에서 플래그를 얻는 문제이다.

 

 

#!/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)

문제에 필요한 코드

 

 

문제에 들어가게 되면

이렇게 시작 페이지가 뜬다.

 

 

upload my memo 페이지에서

제목과 내용을 입력하고 업로드 시킨다.

 

업로드 시킨 파일을 클릭하게 되면

파일의 제목과 함께 내용을 볼 수 있게된다.

 

 

하지만 이 방법을 아무리 써도

플래그를 얻을 수 없다.

 

 

 

addf 파일을 읽을 때 URL을 살펴보면

read?name=addf인 것을 알 수 있다.

 

이 부분을 보고 read?name= 는

바로 뒤에 오는 파일의 내용을

읽는다는 걸 유추할 수 있다.

 

 

다음과 같이 name= 뒤에

../flag.py를 써준다.

 

URL을 위와 같이 조작할 경우

플래그를 얻을 수 있다.

 

정답: DH{uploading_webshell_in_python_program_is_my_dream}