๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœ’๏ธ Web Hacking/Dreamhack

[Dreamhack] Simple-web-request ๋“œ๋ฆผํ•ต ์›Œ๊ฒŒ์ž„ ๋ฌธ์ œ ํ’€์ด

by A Lim Han 2023. 8. 17.

๐Ÿฟ Simple-web-request ๋“œ๋ฆผํ•ต ์›Œ๊ฒŒ์ž„ ๋ฌธ์ œ ํ’€์ด

1. ๋ฌธ์ œ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ฝ์€ ํ›„ ๋ฌธ์ œ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ

2.  ๋‹ค์šด๋ฐ›์€ 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)

 

++  ํŠน์ • ํŽ˜์ด์ง€๊นŒ์ง€ ์ ‘๊ทผํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ˆ, ์•„๋ž˜์˜ ์ฝ”๋“œ์— ์ฃผ๋ชฉ

  ํŒŒ๋ผ๋ฏธํ„ฐ 1์˜ ๊ฐ’ ํŒŒ๋ผ๋ฏธํ„ฐ 2์˜ ๊ฐ’
Step 1  -->  Step 2 getget rerequest
Step 2  -->  FLAG pooost requeeest

 

3.  ๋‹ค์‹œ ๋ฌธ์ œ ํŽ˜์ด์ง€๋กœ ๋Œ์•„์™€ ์„œ๋ฒ„ ์ƒ์„ฑ

4.  Step 1 ํŽ˜์ด์ง€๋กœ ์ด๋™ ํ›„ ๊ฐ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ž…๋ ฅ  -->  Step 2 ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ ๊ฒƒ์„ ํ™•์ธ

5.  Step 2 ํŽ˜์ด์ง€๋กœ ์ด๋™ ํ›„ ๊ฐ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ž…๋ ฅ  -->  FLAG ํ™•์ธ ๊ฐ€๋Šฅ