Untitled

문제 파일을 다운받고, 웹 서버로 들어가 보았다.

참고로, admin의 비밀번호는 아스키코드와 한글로 이루어져 있다.

Untitled

CREATE DATABASE user_db CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON user_db.* TO 'dbuser'@'localhost' IDENTIFIED BY 'dbpass';

USE `user_db`;
CREATE TABLE users (
  idx int auto_increment primary key,
  uid varchar(128) not null,
  upw varchar(128) not null
);

INSERT INTO users (uid, upw) values ('admin', 'DH{**FLAG**}');
INSERT INTO users (uid, upw) values ('guest', 'guest');
INSERT INTO users (uid, upw) values ('test', 'test');
FLUSH PRIVILEGES;
import os
from flask import Flask, request, render_template_string
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', 'user_db')
mysql = MySQL(app)

template ='''
<pre style="font-size:200%">SELECT * FROM users WHERE uid='{{uid}}';</pre><hr/>
<form>
    <input tyupe='text' name='uid' placeholder='uid'>
    <input type='submit' value='submit'>
</form>
{% if nrows == 1%}
    <pre style="font-size:150%">user "{{uid}}" exists.</pre>
{% endif %}
'''

@app.route('/', methods=['GET'])
def index():
    uid = request.args.get('uid', '')
    nrows = 0

    if uid:
        cur = mysql.connection.cursor()
        nrows = cur.execute(f"SELECT * FROM users WHERE uid='{uid}';")

    return render_template_string(template, uid=uid, nrows=nrows)

if __name__ == '__main__':
    app.run(host='0.0.0.0')

app.py의 코드를 보면 알겠지만, 입력받은 값을 uid로 받아 곧바로 sql 쿼리로 이용하는 걸 볼 수 있다. → sql injection 취약점

다만 쿼리 실행결과를 그대로 출력하지 않기 때문에 blind sql injetion 문제라고 가정할 수 있겠다.

이진탐색

이미 정렬된 리스트에서 임의의 값을 효율적으로 찾기 위한 알고리즘

  1. 범위 지정

0부터 100 사이의 범위 내에 한 숫자만이 정답일 때 범위의 중간 값(50)을 지정

  1. 범위 조절
  2. 정답이 50 보다 큰 값인지 확인 → 큰 값이라면 범위를 51 ~ 100으로 조절, 아니라면 0~49로 조절

Binary Search를 이용한 공격