[DreamHack] baby-sqlite

코딩 파인애플·2026년 8월 19일

CHALLENGE SOLVING

목록 보기
10/10
post-thumbnail

안녕하십니까 코딩 파인애플입니다
이번에는 baby-sqlite 에 관해 풀어보겠습니다.

baby-sqlite

https://dreamhack.io/wargame/challenges/1
애기 sqlite입니다 근데 지금 보니까 드림핵 문제번호가 1입니다 ㄹㅈㄷ.

#!/usr/bin/env python3
from flask import Flask, request, render_template, make_response, redirect, url_for, session, g
import urllib
import os
import sqlite3

app = Flask(__name__)
app.secret_key = os.urandom(32)
from flask import _app_ctx_stack

DATABASE = 'users.db'

def get_db():
    top = _app_ctx_stack.top
    if not hasattr(top, 'sqlite_db'):
        top.sqlite_db = sqlite3.connect(DATABASE)
    return top.sqlite_db


try:
    FLAG = open('./flag.txt', 'r').read()
except:
    FLAG = '[**FLAG**]'


@app.route('/')
def index():
    return render_template('index.html')


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')

    uid = request.form.get('uid', '').lower()
    upw = request.form.get('upw', '').lower()
    level = request.form.get('level', '9').lower()

    sqli_filter = ['[', ']', ',', 'admin', 'select', '\'', '"', '\t', '\n', '\r', '\x08', '\x09', '\x00', '\x0b', '\x0d', ' ']
    for x in sqli_filter:
        if uid.find(x) != -1:
            return 'No Hack!'
        if upw.find(x) != -1:
            return 'No Hack!'
        if level.find(x) != -1:
            return 'No Hack!'

    
    with app.app_context():
        conn = get_db()
        query = f"SELECT uid FROM users WHERE uid='{uid}' and upw='{upw}' and level={level};"
        try:
            req = conn.execute(query)
            result = req.fetchone()

            if result is not None:
                uid = result[0]
                if uid == 'admin':
                    return FLAG
        except:
            return 'Error!'
    return 'Good!'


@app.teardown_appcontext
def close_connection(exception):
    top = _app_ctx_stack.top
    if hasattr(top, 'sqlite_db'):
        top.sqlite_db.close()


if __name__ == '__main__':
    os.system('rm -rf %s' % DATABASE)
    with app.app_context():
        conn = get_db()
        conn.execute('CREATE TABLE users (uid text, upw text, level integer);')
        conn.execute("INSERT INTO users VALUES ('dream','cometrue', 9);")
        conn.commit()

    app.run(host='0.0.0.0', port=8001)

문제 코드입니다 제목이 baby-sqlite처럼 sqlite로 작성되어 있어 .sql 파일이 따로 없는 것을 알 수 있습니다

SQLite는 별도의 서버 프로그램 없이 파일 하나로 동작하는 관계형 데이터베이스 관리 시스템(RDBMS) 이다

아무튼, 코드를 좀 살펴보면 일단 기본적으로 필터링이 있으며

 sqli_filter = ['[', ']', ',', 'admin', 'select', '\'', '"', '\t', '\n', '\r', '\x08', '\x09', '\x00', '\x0b', '\x0d', ' ']

app.app_context(): 에서 admin으로 로그인하면 FLAG를 획득할 수 있는 기본적인 로직을 알 수 있습니다

헌데 login을 보면 입력가능한 건 오직 uid와 upw밖에 없어 버프 스위트를 이용해 작은 따음표가 없는 level로부터 sqli를 시도할 생각입니다

이렇게 다음과 같이 필터링을 피해서 띄어쓰기를 /**/로, select를 values로 admin을 char()로 치환하여 (SQL INJECTION WAF 참고)

union values(char(97)||char(100)||char(109)||char(105)||char(110))

을 만들어주면

플래그를 획득할 수 있습니다 오옹 나이스.

flag : DH{sql-lite-cass-lite}
평가 : good 👍

profile
안녕하떼요취미로콤푸타배우는고든학교6학년유치원생이빈다주말재외하고(러블럭스해야대요💢💢)주중연재하고안한날애눈이월(February)됨니다(안할수도있음)

0개의 댓글