on
Dreamhack - simple_sqli
Dreamhack - simple_sqli
Lord of SQLInjection 문제는 꾸준히 풀었기 때문에 sqli 기초는 쉬웠던 것 같다.
#!/usr/bin/python3 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'alert("hello {userid}");history.go(-1);' return 'alert("wrong");history.go(-1);' app.run(host='0.0.0.0', port=8000)
query_db를 보면 select * from users where userid="" and userpassword="" 이 모양이고 userid에 admin이 들어가면 된다. 간단하게 userid에 admin 값을 넣고 주석으로 다 날려주면 된다. 그리고 처음에 # 주석을 사용했는데 이 주석은 사용할 수 없는 것으로 보인다. 대신 -- 를 이용하여 주석 처리를 해준다.
from http://iamstudying.tistory.com/22 by ccl(A) rewrite - 2021-12-17 09:01:13