Skip to content

Commit 10d909d

Browse files
committed
BYUCTF2025-JWTF 글 2차 첨삭 =
- 문제 설명 이미지 추가 - 분석 과정 및 공격 과정 설명
1 parent 6dfbc36 commit 10d909d

File tree

7 files changed

+25
-13
lines changed

7 files changed

+25
-13
lines changed

_posts/2025-05-21-BYUCTF2025-JWTF.md

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,37 +18,48 @@ BYUCTF 2025 웹해킹 `JWTF` 문제 풀이입니다.
1818

1919
## 요약
2020

21-
- 주어진 `admin`의 JWT 토큰이 있었으나, 이는 블랙리스트로 등록되어 있음
21+
- 유출된 `admin`의 JWT 토큰이 있었으나, 이는 블랙리스트로 등록되어 있음
2222
- JWT 토큰의 특징을 이용해, 같은 값을 가지지만 블랙리스트를 우회함
2323

2424
## 문제 상황
2525

26-
우선 문제 배경은 다음과 같습니다.
26+
- 어드민용 계정에 대한 JWT 토큰 값이 유출되어 있음
2727

28-
1. 특정 토큰 값이 노출되어 있는 상황이고, 해당 토큰 값에는 `admin` 필드가 `true`인 상황
28+
![블랙리스트 등록된 이미지지](2025-05-21-1.png){: style="max-width: 100%; height: auto;"}
2929

30-
2. 노출된 토큰 값이 아니고, 페이로드 내에 `admin` 필드가 `true`인 토큰 값을 출력하는 문제
30+
- 유출된 토큰 값에 대한 블랙리스트가 등록되어 있음
3131

32-
다만, 현실적으로 토큰 발급 과정에서 `admin` 필드가 `true`인 토큰 값을 발급하는 것은 불가능했었습니다.
32+
JWT 헤더 값의 암호화 기법을 `none`으로 설정하여 원하는 대로 값을 설정하려 하였으나 불가능하였습니다.
3333

3434
`점수 - 434점, 푼 팀 - 97/894팀`
3535

3636
## 분석 과정
3737

38-
우선 해당 서비스의 백엔드는 파이썬입니다.
38+
![JWT 값 비교 영역](2025-05-21-2.png){: style="max-width: 100%; height: auto;"}
3939

40-
파이썬의 `base64` 모듈은 `urlsafe_b64decode`라는 함수를 제공합니다. 문제는 이 함수가 디코딩 시 확장성을 위해 `url based base64``base64`든 모두 디코딩 시 같은 결과를 출력한다는 점입니다. `PyJWT`는 이를 이용하여 토큰 값을 디코딩합니다.
40+
서버에서 JWT값을 다음처럼 비교하고 있었습니다.
4141

42-
```python
43-
import base64
42+
![jwt.io 소개 페이지](2025-05-21-3.png){: style="max-width: 100%; height: auto;"}
4443

45-
print(base64.urlsafe_b64decode("Twva/sZwHPkmJbLVmvqe1g=="))
46-
print(base64.urlsafe_b64decode("Twva_sZwHPkmJbLVmvqe1g=="))
47-
```
44+
JWT는 내부적으로 `base64UrlEncode`을 이용해 값을 해시화 하고 있었습니다.
45+
46+
![jwt.io 소개 페이지](2025-05-21-4.png){: style="max-width: 100%; height: auto;"}
47+
48+
`base64Url`은 다음처럼 패딩부분만 `+`, `/`에서 `url safe``-`, `_`으로 바뀐 버전이었습니다.
4849

4950
위 코드를 실행해보면 똑같은 값이 출력됩니다.
5051

51-
이를 이용하여 토큰 값의 `-, /` 값을 base64 url safe 인코딩 값으로 변환하여 토큰 값에 지장없이 토큰을 조작할 수 있습니다.
52+
이를 이용하여 토큰 값의 `-`, `_` 값을 base64의 패딩 값으로 변환하여 블랙리스트를 우회하면서 jwt를 이용할 수 있었습니다.
53+
54+
![ctf jrl 페이지](2025-05-21-5.png){: style="max-width: 100%; height: auto;"}
55+
56+
```text
57+
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwidWlkIjoiMTMzNyJ9.BnBYDobZVspWbxu4jL3cTfri_IxNoi33q-TRLbHV-ew
58+
...into...
59+
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwidWlkIjoiMTMzNyJ9.BnBYDobZVspWbxu4jL3cTfri_IxNoi33q+TRLbHV+ew
60+
```
61+
62+
![ctf 공격 성공 페이지](2025-05-21-6.png){: style="max-width: 100%; height: auto;"}
5263

5364
## 알아낸 내용
5465

@@ -58,4 +69,5 @@ print(base64.urlsafe_b64decode("Twva_sZwHPkmJbLVmvqe1g=="))
5869

5970
## 참조
6071

72+
- [jwt.io](https://jwt.io/)
6173
- [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)

assets/img/posts/2025-05-21-1.png

48.4 KB
Loading

assets/img/posts/2025-05-21-2.png

58.9 KB
Loading

assets/img/posts/2025-05-21-3.png

62.6 KB
Loading

assets/img/posts/2025-05-21-4.png

13.7 KB
Loading

assets/img/posts/2025-05-21-5.png

11 KB
Loading

assets/img/posts/2025-05-21-6.png

7.29 KB
Loading

0 commit comments

Comments
 (0)