ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <Root-me> JSON Web Token(JWT) - Introduction
    Wargame/Root-me = Web - Server 2022. 1. 8. 18:18

    JSON Web Token(JWT) - Introduction

    관리자로 접속해야 한다.

     

    ■ JWT

    JWT는 JSON Web Token의 약자로, 전자 서명된 URL-safe(URL로 이용할 수 있는 문자로만 구성된)의 JSON이다.

    전자 서명은 JSON의 변조를 확인할 수 있게 되어있다.

    JWT는 속성 정보(Claim)를 JSON 데이터 구조로 표현한 토큰으로 RFC7519 표준이다.

    JWT는 서버와 클라이언트 간 정보를 주고받을 때 HTTP 요청 헤더에 JSON 토큰을 넣으면, 서버는 별도의 인증 과정 없이 헤더에 포함되어있는 JWT 정보를 통해 인증한다.

     

    ■ JWT Token 구성

    header.payload.signature

    JWT는 위의 세 부분으로 나눠지며, URI에서 파라미터로 사용할 수 있도록 Base64url 인코딩을 사용한다.

     

    - header

    헤더는 토큰의 타입과 해시 암호화 알고리즘(HMAC, SHA256, RSA), 이 두 가지로 구성된다.

     

    - payload

    페이로드는 토큰에 담을 Claim 정보를 포함한다. 페이로드에 담는 정보의 한 조각을 Claim이라 부르고,

    Claim은 name / value의 한 쌍으로 이루어져있다.

    Claim은 registered(등록) Claim, public(공개) Claim, private(비공개) Claim 3 종류가 있다.

     

    - signature

    Secret key를 포함하여 암호화되어 있다.

     

    문제 페이지의 "Login as Guest!"를 누르면 Guest로 로그인된다.

    쿠키를 살펴보면

    jwt를 확인할 수 있는데 위의 JWT 토큰 구조를 확인하여 암호화된 정보가 "eyJ1c2VybmFtZSI6Imd1ZXN0In0"임을 확인할 수 있다.

    이를 Base64url 디코더를 통해 디코딩해보면

    {"username":"guest"} 형태를 확인할 수 있다.

     

    관리자로 접속해야 하기에,

    guest를 admin으로 변경하여 Base64url 인코딩하면

    JWT 페이로드를 이 값으로 변경하여 새로고침 하면

    잘못된 서명(signature)이라고 한다.

     

    서명은 헤더의 인코딩 값과 정보의 인코딩 값을 합친 후, 비밀키로 해싱하여 생성한다.

    비밀키를 알 수 없기에 생성할 수 없다.

     

    이 경우,

    algorithm 값을 none으로 바꾸면, 해싱 알고리즘이 없기에 서명 없이 인증할 수 있다.

    guest의 JWT를 디버깅해보면

    "HS256"을 해싱 알고리즘으로 사용하는 것을 알 수 있다.

     

    따라서, 

    헤더는 {"typ": "JWT", "alg": "none"}

    페이로드는 {"username": "admin"}

    이를 Base64url 인코딩하면

    eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJub25lIn0.eyJ1c2VybmFtZSI6ICJhZG1pbiJ9.

     

    위 값을 jwt 쿠키 값으로 주면

    서명 값 없이 admin으로 인증하여 flag를 획득할 수 있다.

    'Wargame > Root-me = Web - Server' 카테고리의 다른 글

    <Root-me> Directory traversal  (0) 2022.01.11
    <Root-me> PHP - assert()  (0) 2022.01.10
    <Root-me> Weak password  (0) 2022.01.07
    <Root-me> File upload - MIME type  (0) 2022.01.06
    <Root-me> CRLF  (0) 2022.01.06
Designed by Tistory.