문제정보
STEP 1~2를 거쳐 FLAG 페이지에 도달하면 플래그가 출력됩니다.
모든 단계를 통과하여 플래그를 획득하세요. 플래그는 flag.txt 파일과 FLAG 변수에 있습니다.
플래그 형식은 DH{…} 입니다.
📜 웹앱 실행 가이드
본 문제는 웹앱 프레임워크인 Flask로 작성된 웹 페이지입니다. 문제에서 접속 호스트와 포트를 제공하고 있어 url로 접속할 수 있으나, 직접 웹앱을 실행해 보고 싶은 분들을 위해 가이드를 준비했습니다.
문제에 주어진 deploy 디렉토리를 이용하면 웹앱을 실행하고 Flask 웹 서버에 접속할 수 있습니다. 방법은 다음과 같습니다.
터미널 창을 열고 deploy 디렉토리로 이동합니다.
Flask가 처음이라면 pip install flask 명령어로 Flask를 설치합니다.
python app.py 명령어로 파이썬 파일을 실행합니다.
출력된 웹 주소를 복사하여 브라우저에서 접속합니다.
해당 웹 서버에서 문제를 풀면 sample flag가 출력됩니다! 🚩
Keypoint
코드 분석(?)
app.py
#!/usr/bin/python3
import os
from flask import Flask, request, render_template, redirect, url_for
import sys
app = Flask(__name__)
try:
# flag is here!
FLAG = open("./flag.txt", "r").read()
except:
FLAG = "[**FLAG**]"
@app.route("/")
def index():
return render_template("index.html")
@app.route("/step1", methods=["GET", "POST"])
def step1():
#### 풀이와 관계없는 치팅 방지 코드
global step1_num
step1_num = int.from_bytes(os.urandom(16), sys.byteorder)
####
if request.method == "GET":
prm1 = request.args.get("param", "")
prm2 = request.args.get("param2", "")
step1_text = "param : " + prm1 + "\nparam2 : " + prm2 + "\n"
if prm1 == "getget" and prm2 == "rerequest":
return redirect(url_for("step2", prev_step_num = step1_num))
return render_template("step1.html", text = step1_text)
else:
return render_template("step1.html", text = "Not POST")
@app.route("/step2", methods=["GET", "POST"])
def step2():
if request.method == "GET":
#### 풀이와 관계없는 치팅 방지 코드
if request.args.get("prev_step_num"):
try:
prev_step_num = request.args.get("prev_step_num")
if prev_step_num == str(step1_num):
global step2_num
step2_num = int.from_bytes(os.urandom(16), sys.byteorder)
return render_template("step2.html", prev_step_num = step1_num, hidden_num = step2_num)
except:
return render_template("step2.html", text="Not yet")
return render_template("step2.html", text="Not yet")
####
else:
return render_template("step2.html", text="Not POST")
@app.route("/flag", methods=["GET", "POST"])
def flag():
if request.method == "GET":
return render_template("flag.html", flag_txt="Not yet")
else:
#### 풀이와 관계없는 치팅 방지 코드
prev_step_num = request.form.get("check", "")
try:
if prev_step_num == str(step2_num):
####
prm1 = request.form.get("param", "")
prm2 = request.form.get("param2", "")
if prm1 == "pooost" and prm2 == "requeeest":
return render_template("flag.html", flag_txt=FLAG)
else:
return redirect(url_for("step2", prev_step_num = str(step1_num)))
return render_template("flag.html", flag_txt="Not yet")
except:
return render_template("flag.html", flag_txt="Not yet")
app.run(host="0.0.0.0", port=8000)
메인화면
STEP1 -> STEP2 -> FLAG
위의 순서로 접근하면 되는 문제이다.
STEP2로 넘어가는 방법은 매우 간단하다.
FLAG로 넘어가는 방법 또한 매우 간단하다.
코드에 나와있는대로 "pooost" 와 "requeeest"를 입력하면 FLAG가 나온다.
FLAG
DH{c46b414ddba26adfa4606c59655bda0a18fbe260606b042b52d865e0160eea0e}
'DreamHack > web' 카테고리의 다른 글
[wargame] command-injection-chatgpt (0) | 2023.07.15 |
---|---|
[wargame] simple_sqli_chatgpt (0) | 2023.07.15 |
[wargame] ex-reg-ex (0) | 2023.07.15 |
[wargame] Flying Chars (0) | 2023.07.15 |
[wargame] phpreg (0) | 2023.07.14 |