문제 식별

해당 이슈의 홈페이지로 이동하면 사용자 등급을 입력할 수 있는 홈페이지가 있습니다.
문제에 힌트(?)를 주어 ChatGPT와 함께 풀도록 합니다.
파일에서 로그인 입력을 받는 라우팅 부분은 다음과 같습니다.
@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>'
ChatGPT에게 어떤지 물어보세요.

GPT로 접근(?)
GPT는 무엇을 입력해야 하는지 정확히 대답하지 않지만 admin 또는 ‘1’ = ‘1’과 같은 문구를 사용하여
액세스할 수 있음을 알 수 있습니다.
설명
SQL을 공부하기 위해 하나씩 해석하면서 풀어보도록 하겠습니다.
해상도 = query.db(userlevel=”0″ 및 userid=’admin’인 사용자에서 * 선택) 통역할 때
users 테이블에서 userlevel=”0″ 컬럼과 userid=’admin’ 컬럼을 찾아 res 변수에 삽입하는 것을 의미합니다.
표로 보면 다음과 같습니다.
사용자 테이블
| 사용자 수준 | 사용자 아이디 |
| 0 | 관리자 |
| 하나 | 게스트1 |
| 2 | 손님2 |
| … | … |
따라서 res 변수에는 userlevel=”0″, userid=’admin’이 데이터베이스 형태로 저장된다.
if res:
userid = res(0)
userlevel = res(2)
print(userid, userlevel)
if userid == 'admin' and userlevel == 0:
res에 값이 있는 경우:
사용자 아이디 = res(0) # ‘0’이 입력되었습니다.
사용자 레벨 = res(2) # ‘관리자’가 입력됩니다. 숫자는 그것이 어떤 열인지 나타내는 것 같습니다. (걱정 하지마.)
그래서 이 논리로 admin의 가치를 알아보고 싶다면,
변수 userlevel이 있는 곳은 입력 값입니다.
res = query_db(f”select * from users where userlevel=”{사용자 수준}“”) ~을 통해
res 변수에 넣기 때문에
select * from users where userlevel=”0″ and userid=’admin’과 같은 쿼리가 입력되면,
if userid == 'admin' and userlevel == 0:
플래그는 다음에 의해 발행됩니다.
따옴표를 고려하면 입력 값은 다음과 같습니다.
0′ 및 사용자 ID=’관리자
사용자 변수를 입력할 수 있는 곳은 개발자 도구로 확인할 수 있는 로그인 창입니다.

이름이 사용자 수준이라는 사실은 코드에서 분명한 get 메서드에 의해 보고됩니다.

![[pro] 프로그래머스 level2 [pro] 프로그래머스 level2](https://file.dailygagu.kr/wp-content/plugins/contextual-related-posts/default.png)