외로운 Nova의 작업실

dreamhack 웹해킹 - 8(file-download-1) 본문

Web Penetesting/Web Vulnerability

dreamhack 웹해킹 - 8(file-download-1)

Nova_ 2022. 12. 21. 23:24

안녕하세요, 이번시간에는 file-vulnerability 혼자 실습편 file-download-1 문제를 풀어보겠습니다. 정답은 가려져있습니다.



- 문제인식

 

이 문제는 file download 취약점이 존재하는 웹서비스로 flag.py를 다운로드 받으라고합니다. 일단 코드를 봐보겠습니다.

 

- 코드 리뷰

app.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)

/read 부분에 보게되면 사용자의 입력값을 검증없이 사용하고 있습니다. 이에따라 취약점이 발생하게되는 것입니다. 

 

- 문제 풀이

문제서버에 접속하겠습니다.

url에 /read?name=../flag.py를 덧붙여보겠습니다.

쉽게 획득할 수 있습니다.

Comments