(드림핵)(웹) simple_sqli_chatgpt WriteUp

문제 식별


해당 이슈의 홈페이지로 이동하면 사용자 등급을 입력할 수 있는 홈페이지가 있습니다.

문제에 힌트(?)를 주어 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 메서드에 의해 보고됩니다.