워게임/Root Me

[Root Me] JSON Web Token - Introduction - 웹해킹 / JWT

SecurityMan 2022. 7. 6. 11:00

 

JWT와 관련된 20점짜리 웹해킹 문제

 

JWT는 JSON Web Token 의 약자로

 

선택적 서명 및 선택적 암호화를 사용하여 데이터를 만들기 위한 표준을 말한다.

 

웹에서 사용자 인증을 할때 사용한다.

 

반응형

 

이번 문제의 목표는 admin 권한으로 접근하는 것이다.

 

 

문제페이지에 접근하면 이렇게 로그인 창이 뜬다.

 

일단 기능을 좀 살펴보기 위해

 

아래쪽에 있는 Login as Guest! 버튼을 눌러 

 

Guest 계정으로 로그인을 해보았다.

 

 

로그인을 하면 이렇게 

 

Welcome guest to this website! :) 라는 문구가 뜬다.

 

 

 

문제페이지의 쿠키값을 확인해봤다.

 

jwt 라는 이름의 쿠키에 base64로 인코딩된 값이 들어있는게 보인다.

 

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Imd1ZXN0In0.OnuZnYMdetcg7AWGV6WURn8CFSfas6AQej4V9M13nsk

 

자세히보면 하나의 인코딩된 값이 아니라 중간에 . 으로 구분된 3개의 덩어리로 이루어진 것을 볼 수 있다.

 

이렇게 되어있는것이 JWT 의 특징이다.

 

 

참고로 쿠키값을 확인한 저 프로그램은 크롬 확장프로그램 중 하나로

 

https://chrome.google.com/webstore/search/editthiscookie?hl=ko 이곳에서 설치할 수 있다.

 

 

CyberChef(https://gchq.github.io/CyberChef) 에서 Base64로 한번 디코딩 해보았다.

 

그랬더니 첫번째 필드와 두번째 필드에 

 

각각 {"typ":"JWT","alg":"HS256"} / {"username":"guest"} 라는 데이터가 저장되어 있는것이 보였다.

 

참고로 HS256은 암호화 방식으로 SHA-256을 사용하겠다는 의미이다.

 

세번째 필드에서 지정된 암호화 방식을 이용해 JWT를 검증한다.

 

HS256 부분을 none으로,

 

guest 부분을 admin 으로 바꿔본다.

 

CyberChef에서 To Base64 를 고른 뒤에

 

Input으로 {"typ":"JWT","alg":"none"} / {"username":"admin"} 을 입력해준다.

 

아래쪽에 출력된 eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0= 와 eyJ1c2VybmFtZSI6ImFkbWluIn0= 를 따로 저장해준다.

 

 

문제페이지로 돌아와서

 

EditThisCookie를 이용해 쿠키값 수정한다.

 

아까 기억해뒀던

 

eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0= 는 맨 앞에,

 

eyJ1c2VybmFtZSI6ImFkbWluIn0= 는 두번째에 넣어준다.

 

알고리즘을 none 으로 설정했기 때문에 세번째 필드는 필요없다.

 

 

새로고침을 하면 플래그를 찾을 수 있다.

반응형