배경
BYUCTF 2025 웹해킹 JWTF 문제 풀이입니다.
요약
- 유출된
admin의 JWT 토큰이 있었으나, 이는 블랙리스트로 등록되어 있음 - JWT 토큰의 특징을 이용해, 같은 값을 가지지만 블랙리스트를 우회함
문제 상황
- 어드민용 계정에 대한 JWT 토큰 값이 유출되어 있음

- 유출된 토큰 값에 대한 블랙리스트가 등록되어 있음
JWT 헤더 값의 암호화 기법을 none으로 설정하여 원하는 대로 값을 설정하려 하였으나 불가능하였습니다.
점수 - 434점, 푼 팀 - 97/894팀
분석 과정

서버에서 JWT값을 다음처럼 비교하고 있었습니다.

JWT는 내부적으로 base64UrlEncode을 이용해 값을 해시화 하고 있었습니다.

base64Url은 다음처럼 패딩부분만 +, /에서 url safe한 -, _으로 바뀐 버전이었습니다.
위 코드를 실행해보면 똑같은 값이 출력됩니다.
이를 이용하여 토큰 값의 -, _ 값을 base64의 패딩 값으로 변환하여 블랙리스트를 우회하면서 jwt를 이용할 수 있었습니다.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwidWlkIjoiMTMzNyJ9.BnBYDobZVspWbxu4jL3cTfri_IxNoi33q-TRLbHV-ew
...into...
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwidWlkIjoiMTMzNyJ9.BnBYDobZVspWbxu4jL3cTfri_IxNoi33q+TRLbHV+ew

알아낸 내용
PyJWT는base64모듈의urlsafe_b64decode함수를 이용하여 토큰 값을 디코딩합니다.base64모듈의urlsafe_b64decode함수는url based base64든base64든 모두 디코딩 시 같은 결과를 출력합니다.- 토큰 값의
-,_값을 base64의 패딩 값으로 변환하여 블랙리스트를 우회하면서 jwt를 이용할 수 있었습니다.