개발 블로그

[DreamHack] BypassIF 본문

Study/Web Hacking

[DreamHack] BypassIF

얀 짱 2026. 7. 23. 20:39

먼저 또 app.py를 확인함.

#!/usr/bin/env python3
import subprocess
from flask import Flask, request, render_template, redirect, url_for
import string
import os
import hashlib

app = Flask(__name__)

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

KEY = hashlib.md5(FLAG.encode()).hexdigest()
guest_key = hashlib.md5(b"guest").hexdigest()

# filtering
def filter_cmd(cmd):
    alphabet = list(string.ascii_lowercase)     # 소문자 
    alphabet.extend([' '])          # 공백 
    num = '0123456789'
    alphabet.extend(num)            # 0~9 
    command_list = ['flag','cat','chmod','head','tail','less','awk','more','grep']          # 막혀있는 명령어들 

    for c in command_list:
        if c in cmd:
            return True
    for c in cmd:
        if c not in alphabet:           # 소문자, 공백, 0~9 만 가능, 이게 아닌 다른 값들 나오면 차단함
            return True

@app.route('/', methods=['GET', 'POST'])
def index():
    # GET request
    return render_template('index.html')


# /flag 
@app.route('/flag', methods=['POST'])
def flag():
     # POST request
    if request.method == 'POST':
        key = request.form.get('key', '')
        cmd = request.form.get('cmd_input', '')
        if cmd == '' and key == KEY:
            return render_template('flag.html', txt=FLAG)       # 플래그!!! -> flag.txt 읽어와야 하는데 cat 이런거 안됨 -> tac 이거 쓰면 될듯!: 파일 내용을 뒤에서부터 거꾸로 출력합니다.
        elif cmd == '' and key == guest_key:
            return render_template('guest.html', txt=f"guest key: {guest_key}")
        if cmd != '' or key == KEY:
            if not filter_cmd(cmd):
                try:
                    output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)     # 이게 뭐지.. /bin/sh: 유닉스 및 리눅스 시스템에서 스크립트를 실행하는 기본 셸 프로그램이자 명령어 경로 
                    return render_template('flag.html', txt=output.decode('utf-8'))         # 플래그!!! 
                except subprocess.TimeoutExpired:
                    return render_template('flag.html', txt=f'Timeout! Your key: {KEY}')        # 타임 아웃 나면 키 알려줌 
                except subprocess.CalledProcessError:
                    return render_template('flag.html', txt="Error!")
            return render_template('flag.html')
        else:
            return redirect('/')
    else: 
        return render_template('flag.html')


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000, debug=True)

 

하고 이 정도 코드 분석을 함.

import hashlib

print(hashlib.md5(b"guest").hexdigest())            # guest key: 084e0343a0486ff05530df6c705c8bb4

 

해당 코드를 통해 guest key를 얻음. 그걸 넣고 버프 스위트로 intercept on을 함.

그렇게 하면 key=084e0343a0486ff05530df6c705c8bb4 이런 식으로 뜸.

그 뒤에 &cmd_input=ls 를 추가로 입력하고 forward를 했더니 ls에 존재하는 파일들이 나옴.

 

하고 다시 위에 app.py 코드를 봤더니, timeout=5을 했더니 5초 후에 타임아웃이 뜨는 것을 알 수 있었고, return render_template('flag.html', txt=f'Timeout! Your key: {KEY}')에서 타임아웃 나면 key값을 얻을 수 있겠다 싶었음.

 

그래서 cmd_input에 sleep+10을 넣었음. 10초 후에 타임아웃 시키려고.

 

그랬더니 admin의 key 값을 얻어낼 수 있었음.

 

그 key 값을 넣고 submit을 눌렀더니 플래그를 얻음.

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

[DreamHeck] Are you admin?  (0) 2026.07.24
[DreamHeck] Image Uploader  (0) 2026.07.23
[DreamHeck] PTML  (0) 2026.07.23
[Webhacking.kr] old-27  (0) 2026.07.22
[webhacking.kr] old-07  (0) 2026.07.22