alert("hello {userid}");history.go(-1);' return ''"> alert("hello {userid}");history.go(-1);' return ''"> alert("hello {userid}");history.go(-1);' return ''">
@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 페이지의 소스코드는 다음과 같은데, res는 userlevel이 같은 유저들을 모두 불러온 테이블로, db 코드를 보면 guest와 admin 모두 userlevel이 0으로 설정되어있어 두 유저 모두 불러온다.
그러나 1번째 record에 guest가 먼저 기록되어 있기 때문에 admin에 해당 하는 userid를 가져오려면 다음과 같은 쿼리를 입력하면 된다.

0' order by userid -- → admin이 먼저 출력됨

그 결과로 플래그를 획득할 수 있다.