728x90

- JWT(JSON Web Token)란? -

  • JWT(JSON Web Token)이란 RFC7519의 표준이다.
  • 이 JWT는 서버와 클라이언트간에 정보를 주고 받을 때 HTTP Requset 해더에 이 JSON 토큰을 넣어 전송하고 서버는 이 해더의 JWT 정보를 통해 인증한다.
  • 서버가 JWT를 받아 서명이 맞는지 확인해 검증을 한다. <- 데이터베이스에 접근해서 인증할 필요가 없어지는 듯!
  • 서버로 부터 독립적으로 사용이 가능하고, 스스로 만료가 된다고 한다. 일회용 토큰으로 사용하면 될듯.

- JWT 토큰 구성 -

​ Header.Payload.Signature

​ JWT 토큰은 이런식으로 구성되어있다.

Header : 암호화 알고리즘 및 Type

{
    "typ" : "JWT",
    "alg": "HS256"
} // HMAC SHA256 알고리즘 사용

alg는 보안 알고리즘 (alg는 다양한 알고리즘이 있음!)

typ는 type을 의미한다.

Payload: 전송할 내용

{
    "User":"JIJIJIJI"
}

Signature: Header + Payload + Secret_Key

서명 부분은 헤더의 base64인코딩 값과 Payload의 base64인코딩 값을 합친후 주어진 비밀키로 해쉬하여 생성하는 부분이다.

//HMAC SHA256알고리즘을 사용했을 때 예시

HMACSHA256(
    base64Encoding(header) + "." + base64Encoding(payload),
    secret_key
)

이런식으로 만들어진 해쉬값을 base64형태로 만들어준뒤 사용하면 된다!

- Crack -

jwt-cracker

jwt-cracker를 사용해 crack하는 방법이 있다.

$ npm install --global jwt-cracker

​ 사용법

jwt-cracker [JWT] [alphabet] [Max_length]

ex) jwt-cracker asdf.asdf.asdf abcdefghijklmnopqrstuvwxyz 4

alg 값을 none으로 바꾸기

그냥 header부분의 alg값을 none으로 바꾸면 된다.

{
    "typ" : "JWT",
    "alg": "none"
}

이렇게 바꿔 JWT를 만들고 Signature부분은 없애고 전송해본다.

header.payload. <- 이런식으로

algorithm 변조

다른 알고리즘으로 변경해서 공격하는 방법이 있다.

RS256 을 HS256으로 바꾸는 식으로 공격할 수 있다한다.

 

 

 

서명 알고리즘을 RS256에서 HS256으로 변경하면 인증할 때 공개키를 secret으로 사용한다.

- JWT를 만들때 주의 해야할 점 -

base64로 인코딩 할 때 뒤에 붙는 = 이 padding 문자는 제거해 줘야한다!

- 참고 -

https://jwt.io/

https://en.wikipedia.org/wiki/JSON_Web_Token

'WEB' 카테고리의 다른 글

[webhacking.kr] (ALL clear)  (0) 2020.04.07
SQLI procedure analyse()  (0) 2020.03.30
SSTI 팁  (0) 2020.03.12
정리 정리  (0) 2020.03.08
웹 공부!  (0) 2019.02.17