웹 서비스 분석

사용자가 글을 입력하여 업로드 하면 인덱스 페이지에 리스트 되고, 업로드된 글들을 열람할 수 있다.
엔드포인트 분석
/upload
@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')
POST
- 이용자가 입력한 filename, content를 각각의 변수에 저장한다.
만약 filename에 ..라는 문구가 있다면 bad characters,,라는 문구가 있는 페이지를 보여줌.
그리고 uploads/{filename} 파일을 열어서 content에 사용자가 적은 내용을 쓰고 인덱스 페이지에 redirect한다. =
/read
@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)
사용자가 작성했던 게시글을 열고 읽는다. 그리고 읽은 데이터를 data 변수에 저장한다.
이전의 uploads 페이지에서는 업로드 되는 글에 ..라는 문자가 포함되면 bad characters,,라는 문자열이 뜨도록 필터링 해둔 것과 달리, read 페이지에서는 filename에 대한 아무런 필터링이 적용되어 있지 않다.
따라서 파일을 업로드 할 때만 필터링을 적용하고 파일을 다운로드 하여 열람할 때는 필터링이 없기에 url에서 filename을 ../flag.py로 바꿔주면 flag 획득이 가능할 것으로 보인다.

'CTF & Wargame(WEB)' 카테고리의 다른 글
| Carve Party beginner (0) | 2025.04.14 |
|---|---|
| web-ssrf level 2 (0) | 2025.04.14 |
| [dreamhack] level 1 image-storage (0) | 2025.04.14 |
| [dreamhack] beginner command-injection-1 (0) | 2025.04.14 |
| [dreamhack] level 2 mango (0) | 2025.04.14 |