목록CTF (59)
개발세발보안중
import os from flask import Flask, request from flask_mysqldb import MySQL app = Flask(__name__) app.config['MYSQL_HOST'] = os.environ.get('MYSQL_HOST', 'localhost') app.config['MYSQL_USER'] = os.environ.get('MYSQL_USER', 'user') app.config['MYSQL_PASSWORD'] = os.environ.get('MYSQL_PASSWORD', 'pass') app.config['MYSQL_DB'] = os.environ.get('MYSQL_DB', 'users') mysql = MySQL(app) template =''' SE..

char형 특징 - 고정 사이즈 - 남는 공간은 공백으로 채운다 - 값을 받아 올 때 이 공백은 자동으로 제거되며 PAD_CHAR_TO_FULL_LENGTH 모드를 활성화하면 공백까지 다 읽어온다 - 삽입되는 데이터가 선언된 길이보다 작으면 공간은 스페이스로 채워지므로 공간의 낭비가 발생하여 고정길이에 해당하는 데이터만 CHAR로 선언하는 것이 좋다 위에서 id와 ps는 char(32)로 고정 사이즈라고 한다. -> 그러면 32자 외에는 검증을 하지 않게 된다. 즉, admin을 포함하지만 33자인 id를 새로 생성 한다면, 32자까지만 검증을하기 때문에 admin으로 중복 가입이 가능하다. 위의 코드에서 id의 maxlength 를 33으로 수정한다. 그 후, admin 1 // admin + 26번의..

코드에서 sleep(1) 밑 줄을 살펴보면, 입력받은 password를 실제 password랑 비교하여 0이 나오면 된다. 여기서 이 코드의 취약점은, strcmp에 있다. strcmp() 함수는 문자열과 배열을 비교하면 같지 않더라도 0이 출력되는 취약점이 존재한다. 따라서 개발자 도구에서 그리고 로그인 창에 아무거나 입력했더니 플래그가 떴다.

#!/usr/bin/python3 from flask import Flask, request, render_template, make_response, redirect, url_for app = Flask(__name__) try: FLAG = open('./flag.txt', 'r').read() except: FLAG = '[**FLAG**]' users = { 'guest': 'guest', 'user': 'user1234', 'admin': FLAG } session_storage = { } @app.route('/') def index(): session_id = request.cookies.get('sessionid', None) try: username = session_storage[ses..