
배경
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를 이용할 수 있었습니다.