0. 문제
LINECTF2024 | jalyboy-baby
34.84.28.50:10000
1. JWT 구조
Header.Payload.Signature
Header: 사용된 보안 알고리즘에 대한 정보
Payload: 전달할 정보
Signature: Header의 알고리즘으로 암호화된 문자열
ex) eyJhbGciOiJFUzI1NiJ9.eyJzdWIiOiJndWVzdCJ9.XdxV7J2Q6mkgJTIWE6T-Mms_M858I36ZYaO1jtgsh-O6rK0r1IhET_xu2LJ2gKAW3iMbKBxBrKzT2wwS_MMWAQ
Header: eyJhbGciOiJFUzI1NiJ9
Payload: eyJzdWIiOiJndWVzdCJ9
Signature: XdxV7J2Q6mkgJTIWE6T-Mms_M858I36ZYaO1jtgsh-O6rK0r1IhET_xu2LJ2gKAW3iMbKBxBrKzT2wwS_MMWAQ
※ 각 정보들을 .으로 구분
Burp Suite의 Extensions - JSON Web Token Attacker(JOSEPH), JWT.io를 이용
Decoder 항목을 이용해 ex 값을 디코딩하면 다음과 같았다.
Header: {"alg":"ES256"}
Payload: {"sub":"guest"}
Signature: ]�U읐�i %2��2k?3�|#~�a����,�㺬�+ԈDO�nزv���#(A������
# 해시 암호라 복호화가 매우 힘들기 때문에 깨진다.
Header, Payload는 Base64로 인코딩되며 Signature는 Header + Payload + secret 값을 alg으로 암호화된다.
생성된 Header, Payload, Signature로 JWT 토큰을 만들어 보내고 서버와 통신 시 유효성 검증에 사용된다.

2. JWT 취약점 - None 알고리즘
: Header의 alg 부분을 none으로 변조한 후 시그니처를 제거하면 Payload를 변조해도 인증이 되는 문제
ex) eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJndWVzdCJ9.rUKzvxAwpuro6UF6KETwbMPCLBsPGUScjSEZtQGjfX4
Header: {"alg":"HS256"} → {"alg":"none"}
Payload: {"sub":"guest"} → {"sub":"admin"}
Signature: ]�B��0����Az(D�l��,D��!��}~ → 삭제
서버에서 none 알고리즘을 지원함. → 서명 검증을 우회할 수 있기 때문에 주의
* HS256 = HMAC + SHA256
3. 문제와 코드

문제의 페이지에 접속하면 다음과 같은 화면이 나오며, "login as guest" 버튼과 "login as admin" 버튼이 있다.
단, login as guest 버튼만 클릭이 가능하다.


login as guest 버튼을 누르면 j=에 jwt값들이 url에 기록된다.

코드를 보면 sub 값이 ADMIN(admin)과 같을 때 FLAG를 화면에 출력한다.
4. exploit
1. login as guest 버튼을 눌러 jwt 값을 받아온다.
2. alg 값을 none, sub 값을 admin으로 변경하고 시그니처를 제거한다.
3. j=에 변조한 값을 붙여넣는다.


Decoder에서 시그니처 값을 제거, sub 값을 admin 변조했고 Manual에서 Header 값을 none으로 바꿔주었다.

변조한 값을 붙여넣으면 플래그가 나온다.
