Skip to content

Commit 38ad2b7

Browse files
authored
Merge pull request #1 from SlowAnalyst/post/JWT-vulnerability
Add 2025-05-21-JWT-Volunearbility.md
2 parents 8fcbc6b + 582248a commit 38ad2b7

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
---
2+
layout: post
3+
title: "JWT Base64 URL Encoded 취약점"
4+
summary: "JWT Base64 URL Encoded 취약점"
5+
author: wHoIsDReAmer
6+
date: '2025-05-21 15:27:00 +0900'
7+
category: ['etc', 'learning']
8+
tags: cve
9+
thumbnail: /assets/img/posts/2025-05-21-4.png
10+
keywords: ctf, cve, vulnerability
11+
usemathjax: false
12+
permalink: /blog/JWT-Volunerabillity/
13+
---
14+
15+
## 배경
16+
BYUCTF 2025 웹해킹 문제 해결 시도중 찾아보았습니다.
17+
18+
## 요약
19+
20+
- `JWT` 토큰 값을 비교하는 상황에서 취약점 확인
21+
22+
## 문제 상황
23+
24+
우선 문제 배경은 다음과 같습니다.
25+
26+
1. 특정 토큰 값이 노출되어 있는 상황이고, 해당 토큰 값에는 `admin` 필드가 `true`인 상황
27+
28+
2. 노출된 토큰 값이 아니고, 페이로드 내에 `admin` 필드가 `true`인 토큰 값을 출력하는 문제
29+
30+
다만, 현실적으로 토큰 발급 과정에서 `admin` 필드가 `true`인 토큰 값을 발급하는 것은 불가능했었습니다.
31+
32+
## 분석 과정
33+
34+
우선 해당 서비스의 백엔드는 파이썬입니다.
35+
36+
파이썬의 `base64` 모듈은 `urlsafe_b64decode`라는 함수를 제공합니다. 문제는 이 함수가 디코딩 시 확장성을 위해 `url based base64``base64`든 모두 디코딩 시 같은 결과를 출력한다는 점입니다. `PyJWT`는 이를 이용하여 토큰 값을 디코딩합니다.
37+
38+
```python
39+
import base64
40+
41+
print(base64.urlsafe_b64decode("Twva/sZwHPkmJbLVmvqe1g=="))
42+
print(base64.urlsafe_b64decode("Twva_sZwHPkmJbLVmvqe1g=="))
43+
```
44+
45+
위 코드를 실행해보면 똑같은 값이 출력됩니다.
46+
47+
이를 이용하여 토큰 값의 `-, /` 값을 base64 url safe 인코딩 값으로 변환하여 토큰 값에 지장없이 토큰을 조작할 수 있습니다.
48+
49+
## 알아낸 내용
50+
- `PyJWT``base64` 모듈의 `urlsafe_b64decode` 함수를 이용하여 토큰 값을 디코딩합니다.
51+
- `base64` 모듈의 `urlsafe_b64decode` 함수는 `url based base64``base64`든 모두 디코딩 시 같은 결과를 출력합니다.
52+
- 이를 이용하여 토큰 값의 `-, /` 값을 base64 url safe 인코딩 값으로 변환하여 토큰 값에 지장없이 토큰을 조작할 수 있습니다.
53+
54+
## 참조
55+
56+
- [base64-vs-base64-url-safe-그리고-예제](https://velog.io/@dohaeng0/base64-vs-base64-url-safe-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%98%88%EC%A0%9C)

0 commit comments

Comments
 (0)