json
형식의 데이터가 출력된다.
{"message": "Let's play a small game, I bet you cannot access to my super secret admin section. Make a GET request to /token and use the token you'll get to try to access /admin with a POST request."}
해당 데이터는 /token
에 대해 GET
방식으로 request하고, 얻은 토큰으로 /admin
에 대해 POST
로 접근하라고 설명한다.
먼저, 그냥 /admin
페이지에 POST
request 해보자
{"message": "method to authenticate is: 'Authorization: Bearer YOURTOKEN'"}
토큰을 요구하는 메시지가 출력된다.
토큰 전달 형식도 알려주고 있다.
/token
에 접근하여 토큰을 획득한다.
{"Here is your token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiZ3Vlc3QifQ.a4Cxf97xhqpexX-Mw0Ik74ncg6TdCK8R_Q7wYC929himTEOyJmePFYCJYvj-ICUTZrVqjPUa83GeMO5AVuOH0Q"}
디코딩하여 토큰의 payload를 보면
private claim은 다음의 형식을 가진다.
{"role":"guest"}
당연히 guest
를 admin
으로 변경해주어야 한다.
또한 header의 알고리즘 type을 none
으로 변경한다.
그리고 signature를 삭제한다
완성된 토큰
eyJhbGciOiJIUzUxMiIsInR5cCI6Im5vbmUifQ.eyJyb2xlIjoiYWRtaW4ifQ.
/admin
에 접근을 시도
{"message": "I was right, you are not able to break my super crypto! I use HS512 so no need to have a strong secret!"}
... 쓰읍
알고리즘을 그대로 이용하되, 값이 변경됬기 때문에 signature를 수정해야한다.
jwtcat을 이용하여 secret key를 구한다.
앞서 구한 값을 통해 [jwt.io]에서 토큰을 생성한다.
생성된 토큰값으로 인증을 요청하면
{"result": "Congrats!! Here is your flag: ????"}
다음을 참조
scip 블로그 글
http의 인증요청 방식이다.
헤더에 추가하여 사용할 수 있다.