ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DreamHack] simple_sqli
    2022/Write-Ups 2022. 8. 23. 00:07

    1팀 정유진

    웹 문제를 풀어보자

    파일을 다운받아 압축을 풀면 파이썬 파일이 있다.

     

    SQL INJECTION 취약점이란

    웹 해킹 기법 중 하나.

    응용 프로그램 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 코드 삽입 공격 방법이다

    from flask import Flask, request, render_template, g
    import sqlite3
    import os
    import binascii

    app = Flask(__name__)
    app.secret_key = os.urandom(32)

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

    DATABASE = "database.db"
    if os.path.exists(DATABASE) == False:
        db = sqlite3.connect(DATABASE)
        db.execute('create table users(userid char(100), userpassword char(100));')
        db.execute(f'insert into users(userid, userpassword) values ("guest", "guest"), ("admin", "{binascii.hexlify(os.urandom(16)).decode("utf8")}");')
        db.commit()
        db.close()

    def get_db():
        db = getattr(g, '_database', None)
        if db is None:
            db = g._database = sqlite3.connect(DATABASE)
        db.row_factory = sqlite3.Row
        return db

    def query_db(query, one=True):
        cur = get_db().execute(query)
        rv = cur.fetchall()
        cur.close()
        return (rv[0] if rv else None) if one else rv

    @app.teardown_appcontext
    def close_connection(exception):
        db = getattr(g, '_database', None)
        if db is not None:
            db.close()

    @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')
        else:
            userid = request.form.get('userid')
            userpassword = request.form.get('userpassword')
            res = query_db(f'select * from users where userid="{userid}" and userpassword="{userpassword}"')
            if res:
                userid = res[0]
                if userid == 'admin':
                    return f'hello {userid} flag is {FLAG}'
                return f'<script>alert("hello {userid}");history.go(-1);</script>'
            return '<script>alert("wrong");history.go(-1);</script>'

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

    해당 파일의 전체 코드이다.

    로그인 페이지를 들어가서

    id/password에 각각 guest/guest 를 입력하면 로그인된다.

    저 위 코드에 값이 나와있었기 때문에 알 수 있었지만

    userid가 admin인 경우는 나와있지 않다..

     

    따라서 비밀번호 검증을 무력화 시키기위해서 비밀번호 부분을 아예 주석처리를 해버린다.

    그럼 간단하게

    userid는 admin"--이 되고

    userpassword는 아무거나 입력해도 로그인된다.

    '2022 > Write-Ups' 카테고리의 다른 글

    [써니나타스] Game 28  (0) 2022.08.23
    [써니나타스] Game 26  (0) 2022.08.23
    [ctf-d] 거래 조건 알고 있잖아요?  (0) 2022.08.20
    [ctf-d] 저는 당신의 생각을 알고 있습니다.  (0) 2022.08.20
    [ctf-d] broken  (0) 2022.08.17