#! /usr/bin/env python3
#-*- coding: utf-8 -*-
from flask import Flask
from flask import request, url_for
from functools import wraps
from flag import FLAG
import os, json
server = Flask(__name__)
server.secret_key = os.urandom(32)
def check_auth(f):
@wraps(f)
def func(*args, **kwargs):
page = kwargs['page']
if page.split('.')[-1] in ['js', 'css', 'png', 'jpg']:
pass
else:
auth = request.authorization
if not (auth and check_login(auth.username, auth.password)):
return ('Wrong! who are you???😑', 401, {
'WWW-Authenticate': 'Basic realm="show me your id,pw"'
})
return f(*args, **kwargs)
return func
def check_login(user_id, user_pw):
with open(url_for('static', filename='account')[1:], 'r') as f:
data = f.read().strip().split(':')
admin_id = data[0]
admin_pw = data[1]
if user_id == admin_id and user_pw == admin_pw:
return True
return False
@server.route('/')
def main():
return 'Welcome! go to any page!'
@server.route('/<page>')
@check_auth
def flag(page):
if '.' in page:
return server.send_static_file(page)
return FLAG
if __name__ == '__main__':
server.run(host='0.0.0.0')
코드와 같이 주어진다. 아 실제로 ctf중에 못푼 문젠데 너무 아쉬운 문제다. 저 request authorization을 뚫으려고 애썼는데 의도는 그냥 코드에 대한 간단한 문제였다. 처음 check_auth에서 확장자를 검사하는데 저 확장자를 입력해주면 pass가 된다. 또 def flag에서는 '.'이 안들어가면 되니 그냥 /js 로 해주면 바로 풀린다...
solved
flask를 빨리 마스터해야 할것같다. 자꾸 발목을 잡는다.