Header.Payload.Signature
JWT 토큰은 이런식으로 구성되어있다.
{
"typ" : "JWT",
"alg": "HS256"
} // HMAC SHA256 알고리즘 사용
alg
는 보안 알고리즘 (alg는 다양한 알고리즘이 있음!)
typ
는 type을 의미한다.
{
"User":"JIJIJIJI"
}
서명 부분은 헤더의 base64
인코딩 값과 Payload의 base64
인코딩 값을 합친후 주어진 비밀키로 해쉬하여 생성하는 부분이다.
//HMAC SHA256알고리즘을 사용했을 때 예시
HMACSHA256(
base64Encoding(header) + "." + base64Encoding(payload),
secret_key
)
이런식으로 만들어진 해쉬값을 base64
형태로 만들어준뒤 사용하면 된다!
jwt-cracker를 사용해 crack하는 방법이 있다.
$ npm install --global jwt-cracker
사용법
jwt-cracker [JWT] [alphabet] [Max_length]
ex) jwt-cracker asdf.asdf.asdf abcdefghijklmnopqrstuvwxyz 4
그냥 header부분의 alg값을 none으로 바꾸면 된다.
{
"typ" : "JWT",
"alg": "none"
}
이렇게 바꿔 JWT를 만들고 Signature부분은 없애고 전송해본다.
header.payload. <- 이런식으로
다른 알고리즘으로 변경해서 공격하는 방법이 있다.
RS256 을 HS256으로 바꾸는 식으로 공격할 수 있다한다.
서명 알고리즘을 RS256에서 HS256으로 변경하면 인증할 때 공개키를 secret으로 사용한다.
base64
로 인코딩 할 때 뒤에 붙는 =
이 padding 문자는 제거해 줘야한다!
[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 |