이 문제를 풀어야합니다.
file download 취약점이 존재한다고 하니, 서버사이드에서 취약한 부분이 존재하나 봅니다.
우선 서버를 생성해줍니다.
host1.dreamhack.games:10912 로 접속해보면 뭔가 나올 것 같습니다.
일단 문제파일을 받습니다.
파일이 존재하는걸 볼 수 있고, 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)
upload 디렉토리는 uploads 로 확인할 수 있고,
URL에 http://host1.dreamhack.games:10912/ 로 들어가보니 아래와 같습니다.
(asd, asdasd는 Upload My Memo를 통해 입력값을 넣어서 나온 결과로 처음화면은 다릅니다.)
여기에 filename과 content를 test로 임의로 넣으니 아래와 같이 생성됩니다.
이렇게 나오는 것을 볼 수 있습니다.
여기서 url을 확인해보니 http://host1.dreamhack.games:10912/read?name=파일명 으로 나오는 것을 볼 수 있습니다.
따라서 여기에 flag.py를 넣어봅니다.
flag.py파일이 없다고 나옵니다.
다시 한번 app.py의 소스코드를 확인해보니
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')
upload_memo에 파일오픈하는 부분을 참고합니다. 파일앞에 ../ 루트 디렉토리를 통해 접근 가능할 것으로 보입니다.
입력해보니 FLAG 값이 나오는 것을 확인할 수 있었습니다.
flag를 입력해봅니다.
문제 해결된 것을 확인하였습니다.
이번 문제는 소스코드를 분석하고 파일다운로드 취약점에 대한 이해가 있어야 풀수있을것으로 보입니다.
'Security > 드림핵' 카테고리의 다른 글
rev-basic-0 문제풀이 (0) | 2025.02.02 |
---|---|
command-injection-1 문제풀이 (2) | 2025.02.01 |
devtools-sources 문제풀이 (1) | 2025.02.01 |
Exercise: SSH (0) | 2025.01.04 |
Exercise: Welcome-Beginners (0) | 2025.01.04 |
WRITTEN BY