공부/웹해킹 (Web hacking)

[드림핵 | 웹해킹] LEVEL 1: simple_sqli_chatgpt

eunjuu 2023. 9. 8. 19:02
728x90

👾 문제 설명

어딘가 이상한 로그인 서비스입니다.
SQL INJECTION 취약점을 통해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다.
chatGPT와 함께 풀어보세요!

📎 https://dreamhack.io/wargame/challenges/769

 

simple_sqli_chatgpt

어딘가 이상한 로그인 서비스입니다. SQL INJECTION 취약점을 통해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다. chatGPT와 함께 풀어보세요! Reference Server-side Basic

dreamhack.io


접속 정보에 "서버 생성하기"를 눌러서 링크에 접속한다. 

/
접속 완료! 초기 화면이다.
/login

로그인 페이지까지 접속해보았다.

 

 

그리고 문제 파일을 다운로드 받는다.

 

 

압축 파일이 하나 생성되는데, 이 파일을 풀면 app.py가 등장한다.

 

app.py 일부 캡쳐

 

@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' 경로에 대한 GET 및 POST 요청을 처리하는 Flask 뷰 함수인 login 함수를 정의한다. 이 함수는 사용자의 로그인을 처리하고, 로그인에 따라 다른 동작을 수행한다.

 

userlevel = request.form.get('userlevel')

 

→ 사용자가 제출한 폼 데이터에서 'userlevel' 값을 가져온다. 이 값은 사용자가 입력한 사용자 레벨을 나타냄.

res = query_db(f"select * from users where userlevel='{userlevel}'")

 

→ 데이터베이스에서 'userlevel' 값에 해당하는 사용자 정보를 조회한다.

 

        if res:
            userid = res[0]
            userlevel = res[2]
            print(userid, userlevel)

 

 쿼리 결과가 있을 경우 (해당 레벨의 사용자를 찾았을 경우) 다음 동작을 수행한다.

  • userid = res[0]: 조회된 사용자 정보에서 사용자 아이디를 가져옴
  • userlevel = res[2]: 조회된 사용자 정보에서 사용자 레벨을 가져옴
  • print(userid, userlevel): 사용자 아이디와 레벨을 콘솔에 출력함

 

if userid == 'admin' and userlevel == 0:

userid가 'admin'이고 userlevel이 0인 경우, 즉 관리자로 로그인한 경우 환영 메시지와 FLAG 값을 반환한다. 이 정보는 웹 페이지에 표시된다.

 

조건에 맞게 입력!

 

 

해결 완료!

728x90