보상이 걸린 질문
질문에 답변을 달고 보상을 받아가세요!
대기중
10 코인 [WEB] Lv.3 | log in
문제코드 import secrets from flask import Flask, request, render_template from flask_cors import CORS import requests import func as F app = Flask(name) CORS(app) app.secret_key = secrets.token_hex(32) try: FLAG = open("./flag.txt", "r", encoding="utf-8").read().strip() except: FLAG = "[FLAG]" accounts = {"test": "1234", "admin": FLAG} logging.getLogger('flask_cors').level = logging.DEBUG open("log.txt", "w", encoding="utf-8").close() file_handler = logging.FileHandler("log.txt", encoding="utf-8") file_handler.setLevel(logging.DEBUG) formatter = logging.Formatter('%(levelname)s:%(name)s:%(message)s') file_handler.setFormatter(formatter) root_logger = logging.getLogger() root_logger.setLevel(logging.DEBUG) root_logger.addHandler(file_handler) @app.route("/") def home(): return render_template("index.html") @app.route("/login", methods=["GET"]) def login(): username = request.args.get("username") password = request.args.get("password") if username in accounts and accounts[username] == password: logging.debug(f"\nuser={username}") return "로그인 성공!" else: return "로그인 실패" @app.route("/logout", methods=["GET"]) def logout(): user = F.get_login_user() if user: logging.debug(f"user={user} logged out") logging.debug("\nuser=None") return f"{user} 로그아웃 성공!" else: return "로그인 상태가 아닙니다." @app.route("/whoami", methods=["GET"]) def whoami(): user = F.get_login_user() return user if user else "로그인 안됨" @app.route('/calc', methods=['GET']) def calc_proxy(): user = F.get_login_user() if user != 'admin': return 'Get admin account', 403 text = request.args.get('text') allowed_chars = "0123456789+-*/" if not all(char in allowed_chars for char in text): return 'Do not cheat!!!', 503 try: response = requests.get( url=f'http://php_app:5000/?{request.query_string.decode()}', timeout=10 ) return str(eval(response.text, {'builtins': {}})) except: return 'PHP 서버 연결 실패', 503 if name == "main": app.run(host="0.0.0.0", port=8000, threaded=True) func.py def get_login_user(): try: with open("log.txt", "r", encoding="utf-8") as f: for line in reversed(f.readlines()): line = line.strip() if line.startswith("user="): username = line[len("user="):].strip() if username=="None": return None return username except FileNotFoundError: return None return None 제가 지금 알아낸걸로는 f-string쪽에서 \n을 통한 개행이 가능한단 것과 whoami나 logout calc가 log의 마지막 user로 로그가 찍혀 있는걸로 검증을 하는거까지는 알아냈습니다 그리고 clac 부분에서 text 파라미터만 검사를 하는 취약점까진 발견했습니다 그러나 로그인 부분에서 \n을 넣어서 개행을 통해서 로그 인젝션을 시도해봤으나 비교문에서 개행문자들까지 같이 비교가 되서 실패했습니다 이 풀이 방법이 맞나요? 그리고 비교문을 어떻게 우회해야 할까요?? 답보다는 힌트를 주셨으면 좋겠습니다
안녕하세요, 최근 시스템해킹을 공부하고 있는 대학생입니다. 다름이 아니라, 시스템해킹 공부 시 워게임을 풀 때, 워게임의 환경과 동일한 환경에서 진행해야 원활히 문제가 풀리는 것으로 알고 있습니다. 일반적으로 도커파일이 주어지던데, 도커파일 내에 기초적인 패키지가 실려있지 않아 현재로서는 매번 python, vim, pwngdb 같은 패키지를 다운해주고 있는 상황입니다. 개인적인 생각으로는 매번 다운로드하지 않아도 실행될 수 있게 할 수 있는 방법이 분명 존재할 것으로 예상되는데, 고수 여러분들은 어떻게 이 문제를 해결하셨는지 궁금합니다!!!! 저를 꼭 도와주셨으면 합니다 감사합니다.
커뮤니티 최신글