| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
Tags
- 루키즈33기
- 방콕
- 보안공부
- git push -u
- pandas
- 블록(Block)
- 데이터분포
- 태국
- tunder client
- dropna
- 생성형AI
- sqld
- SK쉴더스
- gdgm
- OT후기
- List
- 지도학습
- node.js
- 성능평가지표
- 루키즈
- 패키지
- Linked List
- 함수
- 클래스
- Package
- 꽉뚝짝 시장
- 수업복습
- 레이블인코딩
- 예외처리
- echo 명령어
Archives
- Today
- Total
개발 블로그
[DreamHack] BypassIF 본문
먼저 또 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 |