오호라
중요 코드 부분을 보면
if os.path.exists(DATABASE) == False:
db = sqlite3.connect(DATABASE)
db.execute('create table users(userid char(100), userpassword char(100), userlevel integer);')
db.execute(f'insert into users(userid, userpassword, userlevel) values ("guest", "guest", 0), ("admin", "{binascii.hexlify(os.urandom(16)).decode("utf8")}", 0);')
db.commit()
db.close()
userid가 guest이고 admin인 user가 한 명씩 생성된다. admin의 비번은 알수가 없고 userlevel은 둘 모두 0으로 동일하다.
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
userlevel = request.form.get('userlevel')
res = query_db(f"select * from users where userlevel='{userlevel}'")
if res:
userid = res[0]
userlevel = res[2]
print(userid, userlevel)
if userid == 'admin' and userlevel == 0:
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>'
login 코드는 userlevel을 입력받아 쿼리문을 날리고 있으며 userlevel에 별다른 검사가 없다. 또한 쿼리 반환값을 userid, userlevel 만 가지고 guest인지 admin인지를 구별하고 있다.
응 뭐지..
0' or userid='admin
ㄷㄷ!
'Web Hacking > Dreamhack' 카테고리의 다른 글
[Dreamhack] tmitter write up (0) | 2024.04.11 |
---|---|
[Dreamhack] [wargame.kr] login filtering write up (0) | 2024.04.10 |
[Dreamhack] simple-ssti write up (0) | 2024.04.09 |
[Dreamhack] php-1 write up (0) | 2024.04.07 |
[Dreamhack] proxy-1 write up (2) | 2024.04.07 |