반응형

Root-me에 추가된 문제 중에서 JWT 관련이고 25 포인트밖에 되지 않아서 쉽게 봤었는데 한동안 못 풀었던 문제였습니다..

 

JWT 토큰에 관련된 기본 사항들은 이전 포스트에 써놓았으니 참고하시길 바랍니다!

2019/12/20 - [Study/Wargame] - [root-me] JSON Web Token (JWT) - Introduction

 

[root-me] JSON Web Token (JWT) - Introduction

JSON Web Token(JWT) 관련 문제를 풀어보았습니다. 우선, JWT란 사용자와 서버간에 안전하고 신뢰할 수 있는 정보를 전달할 수 있는 토큰 값입니다. 주로, 회원 인증이나 안전하게 정보를 전달할 경우

ddungkill.tistory.com

 

Revoked Token 관련 문제를 우선 보면, 두 개의 접근 URL을 확인할 수 있습니다. 

1. POST 방식으로 접근하는 /web-serveur/ch63/login 부분과

2. GET 방식으로 접근하는 /web-serveur/ch63/admin 부분입니다.

 

먼저, GET 방식으로 요청되는 admin URL에 접근해보겠습니다.

위 스크린샷에서 보이듯이 Authorization Header 값이 필요합니다. 

 

Authorization값에 삽입되는 JWT 토큰 값을 획득하기 위해 POST 방식으로 요청되는 login URL에 접근해보겠습니다.

Json 형식으로 계정 아이디 값과 패스워드를 전송하라는 메시지가 출력됩니다. 친절하게 아이디와 패스워드까지 알려주었습니다.

 

JSON 형식으로 계정 정보를 전송하니! Access Token 즉 JWT 값이 출력되었습니다.

 

획득한 값을 admin URL 내 Authorization 헤더에 삽입하여 전송하였지만, 토큰이 Revoke(취소)되었다는 에러 메시지가 출력됩니다ㅠㅠ

 

문제 페이지 내에 있는 소스코드를 분석해보니, access_token 값의 유효 시간은 3분이고 해당 값을 발급하자마자 Black List로 보내버립니다. 즉, 저희는 유효하지만 발급되지 않은 JWT 토큰 값이 필요합니다.

 

이전 문제나, JWT Attack과 관련된 모든 방법을 다 써보았지만, 해결을 못하고 있었는데 Root-me에는 의견을 공유하는 게시판? 느낌의 메뉴가 있었습니다. 혹시나 해서 들어가 봤는데 역시나 저와 같은 문제로 인해 해결을 못한 사람들이 질문을 먼저 올려두었더라고요. 

 

해당 질문의 답변에서 유용한 정보를 얻을 수 있었습니다. RFC 4648이 도움이 될 것이라는 것을 말이죠.

 


RFC 4648

RFC 4648은 일반적으로 사용되는 BASE64/32/16 encoding scheme에 대한 내용이다. 이는 또 인코딩 된 데이터의 line-feed, padding, 비(非) 알파벳 문자, 다른 방식으로 인코딩 된 알파벳 등의 사용과 규범적인 인코딩에 대한 내용을 다루고 있다.

 

즉, 지정된 Base64의 포맷의 텍스트로 데이터를 반환하는 RFC의 표준입니다. 다른 형식을 찾아보면

RFC 번호 Text Encoding 지침
1421 최대 64의 행 길이 및 CRLF 라인 끝
2045 최대 76의 행 길이 및 CRLF 라인 끝
3548 줄바꿈이 추가되지 않음(구 버전)
4648 줄바꿈이 추가되지 않음(Default)
4880 최대 76의 행 길이, CRLF 라인 끝 및 추가된 24비트 CRC 값

등이 있습니다.


즉, 정확하게는 모르겠지만 BASE64 인코딩과 관련이 있다는 것을 예상할 수 있습니다.

 

JWT 값은 1. 헤더(Header), 2.정보(Payload), 3.서명(Signature) 가 각각 BASE64 형식으로 인코딩 됩니다.

이 경우 BASE64으로 인코딩 된 결과 값이 A이던, A=던, A==이던 서버는 크게 상관하지 않습니다. 즉 같은 값으로 인식된다는 거죠.

 

따라서, 이를 이용해 발급받은 JWT 값에 "="를 붙여서 보낸다면 서버는 발급하진 않았지만, 유효한 토큰 값(Black List에 없는)으로 인식해서

Flag 값을 획득할 수 있습니다.

 


※ 참고 자료

- https://www.ietf.org/rfc/rfc4648

- https://ko.wikipedia.org/wiki/%EB%B2%A0%EC%9D%B4%EC%8A%A464#RFC_4648

- https://cafe.naver.com/fmnc/148

반응형

'Study > Wargame' 카테고리의 다른 글

[root-me] SQL injection - Time based  (1) 2020.09.25
[root-me] XSLT - Code execution  (0) 2020.07.02
[root-me] Insecure Code Management  (0) 2020.04.07
[root-me] SQL Injection - File reading  (0) 2020.04.01
[root-me] SQL Injection - Routed  (0) 2020.03.20

+ Recent posts