What is JWT attack?

심야·2026년 3월 22일

모의해킹

목록 보기
59/59
post-thumbnail

JWT는 Json Web Token의 약자로서 시스템 간에 암호화된 Json 데이터를 전송하기 위한 표준화된 형식이다. 기존 세션과 달리 서버에 필요한 모든 데이터는 JWT 자체에 클라이언트 측으로 저장한다.

JWT 형식

JWT는 헤더, 페이로드, 시그니처 세 부분으로 구성된다.

eyJraWQiOiI5MTM2ZGRiMy1jYjBhLTRhMTktYTA3ZS1lYWRmNWE0NGM4YjUiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTY0ODAzNzE2NCwibmFtZSI6IkNhcmxvcyBNb250b3lhIiwic3ViIjoiY2FybG9zIiwicm9sZSI6ImJsb2dfYXV0aG9yIiwiZW1haWwiOiJjYXJsb3NAY2FybG9zLW1vbnRveWEubmV0IiwiaWF0IjoxNTE2MjM5MDIyfQ.SYZBPIBg2CRjXAJ8vCER0LA_ENjII1JakvNQoP-Hw6GG1zfl4JyngsZReIfqRvIAEi5L4HV0q7_9qGhQZvy9ZdxEJbwTxRs_6Lb-fZTDpW6lKYNdMyjw45_alSCZ1fypsMWz_2mTpQzil0lOtps5Ei_z7mM7M8gCwe_AGpI53JxduQOaB5HkT5gVrv9cKu9CsW5MS6ZbqYXpGyOG5ehoxqm8DL5tFYaW3lB50ELxi0KsuTKEbD0t5BCl0aCR2MBJWAbN-xeLwEenaqBiwPVvKixYleeDQiBEIylFdNNIMviKRgXiYuAvMziVPbwSgkZVHeEdF5MQP1Oe2Spac-6IfA

JWT 헤더와 페이로드 부분은 base64로 인코딩된 JSON 객체일 뿐이다. 헤더에는 토큰 자체에 대한 메타데이터가 포함되어 있고, 페이로드에는 사용자에 대한 실제 "클레임"이 포함되어 있다. 따라서 시그니처 부분을 제외해 헤더와 페이로드 부분만 버프의 디코더를 사용하면 base64 디코딩할 수 있다.

JWT 대 JWS 대 JWE

JWT는 독립적인 개체로 사용되지 않는다. 웹 서명(JWS) 및 JSON 웹 암호화(JWE) 사양에 의해 확장되며, 이 사양들은 JWT를 실제로 구현하는 구체적인 look 방법을 정의한다.
즉, JWT는 일반적으로 JWS 또는 JWE토큰이다. 하지만 보편적으로 JWT는 JWS 토큰을 의미한다.

JWT 인증과 세션 기반 인증의 차이

세션 기반 인증

서버 측에서 사용자 세션 정보를 DB, Redis 등에 저장.해당 세션을 식별할 수 있는 고유한 세션 ID를 클라이언트 측에 제공함
1. 프론트엔드 측에서 로그인 인증 정보를 백엔드 서버에 전송
2. 서버에서 인증 성공 시, 세션 생성하여 DB,Redis, 세션저장소 등에 저장
3. 고유한 세션 ID가 포함된 쿠키를 클라이언트 측에 전송
4. 브라우저는 모든 요청 헤더에 세션 쿠키를 포함해 전송
5. 서버는 세션 ID 검증 후, 접근 허용

JWT 인증

헤더, 페이로드, 시그니처로 구성되며 인증에 필요한 모든 데이터를 JWT로 생성하여 클라이언트(브라우저) 저장
1. 프론트 측에서 로그인 인증 정보를 백엔드 서버에 전송
2. 서버에서 인증 성공 시, 헤더와 페이로드를 비밀키를 사용해 해싱하여 시그니처(서명) 생성. 헤더와 페이로드, 생성한 시그니처를 조합해 JWT 생성
3. JWT는 클라이언트의 브라우저로 전송 (쿠키로 전달할 때도 있고 응답 바디에 JWT를 포함하기도 함)
4. 브라우저는 모든 요청 헤더에 JWT 포함해 전송
5. 서버는 JWT 유효성 검증 후, 토큰에서 사용자 정보 추출 및 접근 허용

What is JWT attack?

공격자가 서명 미검증으로 인한 페이로드 변조, 비밀키 탈취, 추측 또는 브루트포싱으로 비밀키 유출을 통해 페이로드 변조 등의 방법으로 임의의 값을 가진 유효한 토큰을 생성할 수 있음.
생성한 토큰으로 자신의 권한을 상승시키거나 다른 사용자를 사칭해 계정 탈취 / 서버 장악으로 이어질 수 있음

확인되지 않은 서명을 통한 JWT 인증 우회 (JWT authentication bypass via unverified signature)

이 실습에서는 세션을 처리하기 위해 JWT 기반 메커니즘을 사용한다. 구현 결함으로 인해 서버는 수신하는 JWT의 서명을 확인하지 않는다.

wiener 계정으로 로그인

admin 페이지 접근하니 관리자만 접근 가능함

base64 디코딩 해 JWT 토큰의 헤더와 페이로드 확인
RS256 알고리즘을 사용하며 sub (토큰 주체 (사용자 ID 등)) 값은 로그인 한 아이디 wiener 임

JWT Tool 사용해 페이로드의 sub 를 administrator로 변조

# 실행 명령어
python3 jwt_tool.py [Token value] -I -pc sub -pv administrator

-I: Interactive mode (대화형 모드) - 페이로드를 수정할 수 있게 함
-pc sub: Payload Claim - 수정할 클레임을 'sub'로 지정
-pv administrator: Payload Value - 새로운 값을 'administrator'로 설정

생성된 JWT 토큰은 페이로드의 sub 값만 administrator로 변조함, 알고리즘도 기존 RS256 사용

# 변조 토큰
eyJraWQiOiJmOGQwNGNjYS1kYWUxLTQ4MjQtYTFjZS05MDE2NjFkYWU3NmIiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTc1MjkxMDcxMywic3ViIjoiYWRtaW5pc3RyYXRvciJ9.igzCWCr5fANareIINxBLk-lfyA5fpXRxeRgyTPWtUs4XDyGmoT-4TL7Y-h-Aq776KyBPq7Sc-p5JrtvcvGZonShAOfnXQZwXjAcoYni0He-bSu_7SjuBOoYgv-xlQeTG7eQV04oYzJQxyZYV8zIcKaoO6G0mHPVuGIX6IpbfqhfRH5KM_xQVIBy9ubiPOaWgssSom4MExIPPxF-dKKkNXM_63xxzCMe_GsDSw8lEUXtLyeVpCOCbsU__nCkqH9KlOIXyopu2zMudB1dHCPyx4qGiNASD6FhC0K1gWQN_8noFc5-NiHLs1MM90maa_DLnI9wByhijj85Gh-FUe6XjcA

JWT 서명을 확인하지 않아 변조된 토큰으로 관리자 페이지 접근 성공

서명을 확인하지 않기 때문에 시그니처 부분에 임의의 값을 삽입하여도 관리자 페이지 접근이 가능함

wiener, carlos 계정 삭제해 문제 해결

결함이 있는 서명 확인을 통한 JWT 인증 우회 (JWT authentication bypass via flawed signature verification)

이 실습에서는 세션을 처리하기 위해 JWT 기반 메커니즘을 사용한다. 서버는 서명되지 않은 JWT를 허용하도록 안전하지 않게 구성되어 있다. 서버는 서명되지 않은 JWT를 허용하기 때문에 none 알고리즘으로 생성한 토큰으로 관리자 페이지 접근이 가능하다.

wiener 계정으로 로그인

JWT Tool 사용해 JWT 토큰 디코딩

JWT Tool 사용해 JWT 페이로드의 sub 클레임을 administrator로 수정하고 alg을 none으로 변경함

# 실행 명령어
python3 jwt_tool.py [Token value] -I -pc sub -pv administrator -X a

- -I: Interactive mode (대화형 모드) - 페이로드를 수정할 수 있게 함
- -pc sub: Payload Claim - 수정할 클레임을 'sub'로 지정
- -pv administrator: Payload Value - 새로운 값을 'administrator'로 설정
- -X a: alg:none 공격 수행

none 알고리즘으로 변조한 토큰으로 관리자 페이지 접근 성공

wiener, carlos 계정 삭제해 문제 해결

profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글