주제
JWT 취약점 악용 (1) - None Algorithm, Algorithm Confusion
JWT 개념에 대한 내용은 아래 포스팅에서 확인 가능합니다.
https://so106037.tistory.com/421
JWT(JSON Web Token) 개념
주제JWT 개념내용1. JWT 개념JWT(JSON Web Token)는 웹 애플리케이션에서 클라이언트와 서버 간에 정보를 안전하게 전송하기 위해 사용되는 토큰 기반의 인증 메커니즘입니다. 일반적으로 인증, 세션
so106037.tistory.com
내용
1. None Algorithm
JWT의 none 알고리즘은 JSON Web Token에서 사용 가능한 서명 알고리즘 중 하나로, 서명이 없는 JWT를 나타냅니다.
{
"alg": "none",
"typ": "JWT"
}
# 서명 부분이 생략된 JWT
<Base64URL-encoded Header>.<Base64URL-encoded Payload>.
JWT 라이브러리가 잘못 구현되어, 서명 검증이 필요한 상황에서도 none 알고리즘을 허용하는 경우 악용이 가능합니다.
가정: 서버가 none 알고리즘을 허용
익스플로잇:
Step 1) JWT 토큰 확인
Step 2) 공격자가 JWT 생성 → 토큰 유효
- 헤더의 alg 값을 none 으로 설정
- 서명 부분을 빈 문자열로 설정
2. Algorithm confusion (RSA/HMAC)
서명 검증방식은 보통 아래와 같이 이루어집니다.
verify(string token, string verificationKey)
#JWT의 alg 헤더 값과 입력받은 verificationKey를 바탕으로 서명을 검증
여기서 verificationKey 는 서명 방식을 기준으로 달라질 수 있습니다
- HMAC 서명 방식: 비밀 키(secret signing key)가 들어감
- RSA 서명 방식: 공개 키(public key)가 들어감
정리하면,
- HMAC
- 대칭 키 알고리즘
- 하나의 비밀 키를 사용하여 서명과 검증을 수행
- 검증 시 verify(clientToken, serverHMACSecretKey) 의 형태로 서버에서 비밀 키를 사용
- RSA
- 비대칭 키 알고리즘
- 개인 키로 서명하고, 공개 키로 검증
- 검증 시 verify(clientToken, serverRSAPublicKey) 형태로 서버에서 공개 키를 사용
서버가 RSA 서명방식을 사용하도록 설계되었음에도 불구하고 HMAC 서명을 허용하는 경우 악용이 가능합니다.
가정:
a. 서버가 클라이언트의 alg 헤더 값을 신뢰
b. 서버가 키의 적합성을 미검증
c. 공격자가 RSA 공개 키 획득
익스플로잇:
Step 1) JWT 토큰 확인 (guest 계정)
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJsb2dpbiI6Imd1ZXN0In0.AyCmqz4soB6rKuRUBsXWA4WwX0LBxM-uPGJIJ1L-X_ERrIVN5tBBmrK2JAe3tkH2XQTv4o1XTi6Q6p7ogl0DSlbiS8Ej56KsqZYgWRXjSZ0XKgdZtpTMH_a0o43J6SjKtkRJ_N42iJ6-ANiy6ff9ix_qq3D_UjZUods1VoDTCavIG-zRinavo7eryVkUHWLdYKGfwpGLyLekMbpukhKAxnlecagQ5YzmC_QiQGVuJj5ucZlIoqE8cyRjsA3hC4D_XgHYulxoniCiT-LY5EUMtDgGXAxDou9_GXASsuGorjra_HP1wk4fqKmt9YNkDAr20yiBXI_S98-6sloskz6dkw
# header {"typ":"JWT","alg":"RS256"}
# payload {"login":"guest"}
Step 2) RSA 공개 키를 HMAC 서명 키로 사용하여 토큰 생성
- “alg”: “RS256” → “HS256”
Step 3) 생성된 토큰을 서버에 전송 → guest 계정 토큰 유효
- 서버의 RSA 공개 키를 HMAC 비밀 키로서 사용한 것으로 받아들였기 때문
Step 4) JWT 페이로드 변경 후 토큰 생성 → admin 계정 토큰 유효
레퍼런스
- Auth0: Critical vulnerabilities in JSON Web Token libraries (링크)
- Pentesterlab: JWT Algorithm Confusion (링크)
- PortSwigger: Algorithm confusion attacks (링크)
'보안 > 웹·모바일' 카테고리의 다른 글
CVE-2020-1938: Tomcat-AJP 프로토콜 취약점 (0) | 2025.03.07 |
---|---|
JWT(JSON Web Token) 취약점 악용(2) - Brute Force, jwk/jku/kid injection (0) | 2025.02.10 |
JWT(JSON Web Token) 개념 (0) | 2025.01.05 |
CVE-2024-4577:PHP-CGI 원격 코드 실행 (0) | 2024.12.23 |
Burp Suite로 패킷이 잘 안잡힘 해결 (0) | 2024.02.16 |